[英]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()
,Runtime.getRuntime().gc()
和System.runFinalization()
。 无论是否使用-Xdisableexplicitgc
选项禁用垃圾收集,代码都应具有相同的行为。 此外,“现代”jvms在处理垃圾收集方面做得非常好。 如果在应用程序中开发与内存泄漏无关的内存使用问题,则应该使用JVM选项而不是代码本身。
一般来说GC只在需要时才运行。 例外,并发标记扫描将提前启动,以避免必须停止应用程序。
恕我直言,最简单/最好的解决方案是不要创造如此多的垃圾。 您可以使用内存分析器来减少生成的垃圾量。 这将减少您的集合的大小以及它们发生的频率。 在极端情况下,您可以避免在白天甚至整整一周内收集。
减少垃圾的好处是减少使用垃圾刷新CPU缓存。 您的L3缓存只有几MB而且您创建了几MB垃圾,您将有效地推出有用信息,从而减慢您的应用程序速度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.