繁体   English   中英

限制JVM不要调用GC

[英]Restricting JVM not to invoke GC

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

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

这取决于。

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

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

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

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

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

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

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

如果您正在尝试最小化GC暂停,那么Java性能书籍有一些很好的材料。

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

另一方面:

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

代码正确性:调用System.gc()

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

PMD规则DoNotCallGarbageCollection明显地

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM