我们有一个PHP webapp,它调用Java二进制文件来生成PDF报告(使用JasperReports)。 Java二进制文件将PDF输出到标准输出并退出; PHP然后将PDF发送到浏览器。这个Java命令持续大约3到6秒,我认为当它持续6秒时,因为GC启动了。我想禁用GC,因为无论如何当命令退出所有内存时都会返回。
我想知道如何为Java 1.4.2和Java 1.6.0禁用它,因为我们正在测试两个JVM以查看哪个表现更快..
答案 0 :(得分:36)
这听起来像是在试图节省时间,但却以错误的方式进行。与启动和关闭java进程所花费的时间相比,禁用垃圾回收所节省的时间(对于单个任务而言)将是微不足道的。如果运行时性能是您的目标,您可能需要考虑进行Java进程启动,您可以多次请求执行所需的工作。
答案 1 :(得分:28)
当JVM内存不足时,GC才会启动,因此无论是GC还是死机。尝试打开详细GC并查看它是否确实需要花费大量时间。
java -verbose:gc
答案 2 :(得分:28)
无法完全禁用垃圾回收。垃圾收集仅在JVM空间不足时运行,因此您可以为程序提供更多内存。将这些命令行选项添加到Java命令
-Xmx256M -Xms256M
这给程序256Mb的ram(默认为64Mb)。但是,对于默认大小的JVM,垃圾收集不会花费3秒钟,因此您可能希望更密切地调查程序正在执行的操作。 Yourkit profiler对于弄清楚需要很长时间的事情非常有用。
答案 3 :(得分:5)
Java 11带有no-op garbage collector。
可以在JVM启动时通过-XX:+UseEpsilonGC
选项启用它。
根据JEP decription的目标之一是提高某些短期工作的效率,这可能是您的用例:
寿命极短的工作。短暂的工作可能依赖于快速退出以释放资源(例如堆内存)。在这种情况下,接受GC周期徒劳地清理堆是浪费时间,因为无论如何退出堆都会释放堆。请注意,GC周期可能需要一段时间,因为它取决于堆中实时数据的数量,这可能很多。
答案 4 :(得分:2)
您可以使用-Xmx
选项设置最大堆大小;使用更大的堆应该可以防止VM运行内存不足,从而需要很快收集垃圾。
答案 5 :(得分:2)
Java 11 为您提供了开启 Java GC 或关闭 Java GC 的二进制选项。要关闭 Java GC,您需要使用 Epsilon Garbage Collector,它必须在命令行中关闭。在 Java 11 上,使用以下两个 JVM 参数:
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
如果没有 UnlockExperimentalVMOptions
参数,JVM 将无法启动,因此请确保包含它。
不幸的是,如果您不使用 Epsilon GC,则无法禁用、停止或阻止垃圾收集的发生。就像不能触发 GC 一样,你也不能 stop Java GC。算法是不确定的。只有 JVM 可以控制它们何时发生。
答案 6 :(得分:1)
你确定它是垃圾收集导致减速吗?你用-verbose:gc运行java来看看发生了什么吗?
您无法在JVM上禁用垃圾回收。但是,您可以查看垃圾收集器tuning以获得更好的性能。
答案 7 :(得分:-1)
正如大家所说,你无法在JVM中禁用GC,这是正确的,因为如果你因为java没有明确的方式让开发人员删除堆数据而导致内存泄漏。 / p>
您是否可以访问此java二进制文件的来源?如果是这样的话,可能值得对它进行分析,看看是否有任何瓶颈可以更好地编写以减少GC活动。这可以通过大多数java分析器来完成,例如JProbe。
答案 8 :(得分:-1)
为避免垃圾收集器从任何对象释放变量或属性, 您必须在类中将此属性(由gc发布)设置为静态 这是我的解决方案。
示例:
private static String myProperty;