如何禁用Java垃圾收集器?

Nel*_*son 33 java performance garbage-collection

我们有一个PHP webapp调用java二进制文件来生成pdf报告(使用jasperreport),java二进制文件输出pdf到标准输出并退出,然后php将pdf发送到浏览器.这个java命令持续大约3到6秒,我认为当它持续6秒时,因为GC启动,所以我想禁用它,因为无论如何当命令退出所有内存时返回..

我想知道如何为Java 1.4.2和Java 1.6.0禁用它,因为我们正在测试两个JVM以查看哪个执行速度更快..

谢谢

Pau*_*ett 36

这听起来像是在试图节省时间,但却以错误的方式进行.与启动和关闭java进程所花费的时间相比,禁用垃圾回收所节省的时间(对于单个任务而言)将是微不足道的.如果运行时性能是您的目标,您可能需要考虑进行Java进程启动,您可以多次请求执行所需的工作.

  • @Nelson Java本身并没有泄漏内存.我们有java deamons运行了几个月,只是重新启动应用程序更新或系统停机时间.如果您的Java程序泄漏,请尝试使用分析器.还有其他选择,而不是自己打开插座.有ActiveMQ/JMS,JMX,或者你可以为它创建一个web服务,也许jetty会很有趣. (4认同)

unb*_*eli 28

当JVM内存不足时,GC才会启动,因此无论是GC还是死机.尝试打开详细GC并查看它是否确实需要花费大量时间.

java -verbose:gc
Run Code Online (Sandbox Code Playgroud)

  • +1为"测试,不要猜测".时间差异可能是完全不相关的东西,比如I/O争用或一些CPU繁重的过程. (6认同)
  • 是的,在分析了verbose:gc 的输出后,您就会知道是否需要这样做。这是第一步。 (2认同)

Cei*_*ish 28

没有办法完全禁用垃圾收集.垃圾收集仅在JVM空间不足时运行,因此您可以为程序提供更多内存.将这些命令行选项添加到Java命令

-Xmx256M -Xms256M
Run Code Online (Sandbox Code Playgroud)

这给程序256Mb的ram(默认为64Mb).但是,对于默认大小的JVM,垃圾收集不会花费3秒钟,因此您可能希望更密切地调查程序正在执行的操作.Yourkit profiler对于弄清楚需要花费很长时间的内容非常有用.


ave*_*rin 8

Java 11附带了一个无操作垃圾收集器

可以通过-XX:+UseEpsilonGCJVM启动时的选项启用它。

根据JEP规定,其目标之一是提高某些短期工作的效率,您可能会用到什么用例:

寿命极短的工作。短暂的工作可能依赖于快速退出以释放资源(例如堆内存)。在这种情况下,接受GC周期徒劳地清理堆是浪费时间,因为无论如何退出堆都会释放堆。请注意,GC周期可能要花一些时间,因为它取决于堆中活动数据的数量,这可能很多。


Cam*_*zie 6

Java 11 为您提供了打开 Java GC 或关闭 Java GC 的二元选项。要关闭 Java GC,您可以使用 Epsilon 垃圾收集器,必须在命令行上关闭它。在 Java 11 上,使用以下两个 JVM 参数:

-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
Run Code Online (Sandbox Code Playgroud)

如果没有该UnlockExperimentalVMOptions参数,JVM 将无法启动,因此请确保包含该参数。

无法停止 Java GC

不幸的是,如果您不使用 Epsilon GC,则无法禁用、停止或阻止垃圾收集的发生。就像无法触发GC一样,你也无法停止Java GC。这些算法是不确定的。只有 JVM 可以控制它们何时发生。