Full GC - Sun JVM 运行频率

4
在JDK 1.6中:我看到运行了full GC(全垃圾回收),但老生代和永久代空间并没有完全使用 - 我的问题是根据我的理解,只有当老生代或永久代已满时才会运行FGC(Full GC)-虽然使用率很低,但我无法理解为什么它运行了?
请参见下面jstat -gcutil的输出:
    S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
   0.00  82.14  51.17  13.78  26.43    219   19.347     1    0.131   19.479
S0 S1 E O P YGC YGCT FGC FGCT GCT 82.14 0.00 9.12 13.92 26.66 222 19.771 1 0.131 19.902
S0 S1 E O P YGC YGCT FGC FGCT GCT 82.14 0.00 11.07 9.07 24.15 230 20.166 2 1.851 22.017
我的最小/最大堆大小为1024M,最小和最大permGen空间定义为768M。

可能的一个原因是RMI:“RMI强制进行周期性的完全收集。这些收集的频率可以通过属性java -Dsun.rmi.dgc.client.gcInterval和-Dsun.rmi.dgc.server.gcInterval来控制。” http://java.sun.com/docs/hotspot/gc1.4.2/ - Anna
3个回答

1

我通过设置JVM选项XX:-DisableExplicitGC来解决了这个问题。

一些外部jar文件中可能存在代码明确调用System.gc,从而导致垃圾回收行为。禁用这些调用后,垃圾回收将在接近100%使用率时运行,符合预期行为。


1

打开详细垃圾回收(verbose gc)以确定何时发生了完整的垃圾回收。因为jstat即使针对major/tenured collections,也会显示FGC事件。

欲了解更多信息,请访问


0
只有在老一代或永久代满时,FGC才会运行。
这并不是真的。请阅读Java参考文献此处
Java中的内存管理可能会让每个人都感到惊讶。需要多年时间才能学会为非平凡应用程序设置JVM参数。
永久代空间被定义为768M。
将其减少到128M。

无法减少Perm Gen空间 - 因为我们的应用程序会大量消耗它...使用高值是否有任何不利影响? - Anna
你的应用程序为什么会大量消耗永久代?你使用DOM XML解析器或比较多个字符串并调用intern吗? - baklarz2048
从您引用的pdf链接中可以看到:“当年轻代填满时,通常会执行一个仅针对该代的年轻代集合(有时称为小集合)。当老年代或永久代填满时,通常会执行一个完整的集合(有时称为大集合)”。那么,在老/永久代没有填满的情况下,何时会执行GC呢? - Anna
你使用哪个应用服务器? - baklarz2048
你遇到的问题是YG而不是PG或OG。你使用哪个收集器?这个版本的Tomcat是一个博物馆泄漏。首先减少PG(它只使用25%),或者增加堆大小。 - baklarz2048

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