限制JVM不调用GC

7

JVM如何确定何时进行垃圾回收?有没有办法限制JVM不触发GC?


8
不是直接的,没有。你试图解决的实际问题是什么? - NPE
1
也许你可以购买一台拥有无限内存的机器,但这些很难找到 :-) 并且价格无限昂贵 :-) - Basile Starynkevitch
1
@VishalK 的链接无法访问。 - Dungeon Hunter
2
如何避免垃圾回收 by Peter Lawrey 原文链接 - maba
你尝试过使用C++吗? - Michael Deardeuff
显示剩余3条评论
5个回答

5
JVM如何确定何时进行垃圾回收?
这取决于使用的内存回收器。
如果使用吞吐量收集器,则在无法在需要分配对象的空间(或其中一个空间)中分配新对象时,JVM运行GC。
如果使用低暂停时间收集器,则在可配置级别下空闲空间比率降至一定水平时,JVM触发GC。
有没有办法限制JVM不执行GC?
没有。如果JVM决定需要运行GC,则会运行它。唯一可以做的就是告诉JVM忽略应用程序代码调用System.gc()的请求。

4

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


3
通常情况下,当堆中某个区域接近满时,JVM会决定运行垃圾回收循环。请注意,最终决策权在JVM手中。
至于指示JVM暂时不执行GC,除了完全避免堆分配之外,没有可靠且可移植的方法。
如果您正在尝试将GC暂停最小化,Java性能一书提供了一些优秀的材料。

1

这主要取决于虚拟机的实现。

另一方面:

显式请求垃圾收集是预示可能存在性能问题的风向标。

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

不建议调用System.gc()Runtime.getRuntime().gc()System.runFinalization()。代码应该在使用选项-Xdisableexplicitgc禁用垃圾回收或不禁用时具有相同的行为。此外,“现代”jvm处理垃圾回收非常出色。如果应用程序内部出现与内存泄漏无关的内存使用问题,应使用JVM选项而不是在代码内部解决。

PMD规则DoNotCallGarbageCollectionExplicitly


0

一般来说,垃圾回收只有在必要时才会运行。其中一个例外是并发标记清除,在需要避免停止应用程序的情况下会提前启动。

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

减少垃圾的好处是您减少了用垃圾刷新CPU缓存。您的L3缓存仅有几MB,如果您创建了几MB的垃圾,则实际上已经推出了有用信息,从而减慢了应用程序的速度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接