7

JVM究竟如何确定它应该是Garbage Collector?有没有办法限制JVM不调用GC?

4

5 回答 5

5

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

这取决于。

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

  • 如果您使用的是低暂停收集器,那么当可用空间比率下降到可配置的水平以下时,JVM 会触发 GC。

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

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

于 2013-03-27T07:28:52.600 回答
4

你不能告诉 JVM 不要调用 GC,但你可以告诉 JVM 忽略对System.gc()via的调用-XX:+DisableExplicitGC

于 2013-03-27T07:24:46.483 回答
3

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

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

如果你想尽量减少 GC 暂停,Java Performance book 有一些很好的材料。

于 2013-03-27T07:24:54.493 回答
1

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

另一方面:

垃圾收集的明确请求是表明可能存在性能问题的风向标。

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

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

PMD 规则 DoNotCallGarbageCollectionExplicitly

于 2013-03-27T07:35:35.363 回答
0

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

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

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

于 2013-03-27T07:49:34.403 回答