JVM究竟如何确定它应该是垃圾收集器?有没有办法限制JVM不要调用GC?
答案 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选项而不是代码本身。
答案 4 :(得分:0)
一般来说GC只在需要时运行。例外,并发标记扫描将提前开始,以避免必须停止应用程序。
恕我直言,最简单/最好的解决方案是不要创造如此多的垃圾。您可以使用内存分析器来减少生成的垃圾量。这将减少您的集合的大小以及它们发生的频率。在极端情况下,您可以避免在白天或甚至整整一周内收集。
减少垃圾的好处是减少使用垃圾刷新CPU缓存。您的L3缓存只有几MB而且您创建了几MB垃圾,您将有效地推出有用信息,从而减慢您的应用程序。