限制JVM不要调用GC

时间:2013-03-27 07:19:48

标签: java garbage-collection

JVM究竟如何确定它应该是垃圾收集器?有没有办法限制JVM不要调用GC?

5 个答案:

答案 0 :(得分:5)

  

JVM究竟如何确定它应该是垃圾收集器?

这取决于。

  • 如果您正在使用吞吐量收集器,那么当JVM无法在需要分配它的空间(或其中一个空间)中分配新对象时,JVM就会运行GC。

  • 如果您使用的是低暂停收集器,那么当可用空间比率低于可配置级别时,JVM会触发GC。

  

有没有办法限制JVM不要调用GC?

没有。如果JVM决定它需要运行GC,它将运行它。您唯一能做的就是告诉JVM忽略对System.gc()的应用程序代码调用。

答案 1 :(得分:4)

您不能告诉JVM不要调用GC,但您可以告诉JVM忽略通过System.gc()-XX:+DisableExplicitGC的调用。

答案 2 :(得分:3)

通常,当其中一个堆区域接近满时,JVM决定运行垃圾收集周期。请注意,最终,决策取决于JVM。

至于指示JVM暂时不执行GC,没有可靠且可移植的方法(除了完全避免堆分配)。

如果您尝试最小化GC暂停,Java Performance本书有一些很好的材料。

答案 3 :(得分:1)

这实际上取决于虚拟机的实现。

另一方面:

  

明确的垃圾收集请求是指示可能存在性能问题的领头羊。

Code Correctness: Call to System.gc()

  

不建议拨打System.gc()Runtime.getRuntime().gc()System.runFinalization()。无论是否使用选项-Xdisableexplicitgc禁用垃圾收集,代码都应具有相同的行为。此外,“现代”jvms在处理垃圾收集方面做得非常好。如果在应用程序中开发与内存泄漏无关的内存使用问题,则应该使用JVM选项而不是代码本身。

PMD Rule DoNotCallGarbageCollectionExplicitly

答案 4 :(得分:0)

一般来说GC只在需要时运行。例外,并发标记扫描将提前开始,以避免必须停止应用程序。

恕我直言,最简单/最好的解决方案是不要创造如此多的垃圾。您可以使用内存分析器来减少生成的垃圾量。这将减少您的集合的大小以及它们发生的频率。在极端情况下,您可以避免在白天或甚至整整一周内收集。

减少垃圾的好处是减少使用垃圾刷新CPU缓存。您的L3缓存只有几MB而且您创建了几MB垃圾,您将有效地推出有用信息,从而减慢您的应用程序。