在JDK 1.6中:我看到已经运行了完整的GC,但是旧代和perm gen空间没有被完全使用 - 问题是根据我的理解FGC仅在旧的gen或perm gen已满时运行 - 我无法要理解为什么它已经运行,即使使用率%很低?。
请参阅下面的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。
答案 0 :(得分:1)
我通过放置jvm opts解决了这个问题:XX:-DisableExplicitGC
。
某些外部jar文件中的某些代码可能已显式调用System.gc
,导致此类垃圾回收行为。禁用这些,导致垃圾收集的预期行为在即将达到100%使用时运行。
答案 1 :(得分:1)
当完整的gc发生时,准确地打开详细的gc。因为jstat即使对于主要/终身收藏也会显示FGC事件
答案 2 :(得分:0)
FGC仅在旧的gen或perm gen已满时运行
这不是真的。阅读java参考文件here
Java中的内存管理可能会让每个人感到惊讶。学习如何为非平凡的应用程序设置JVM参数需要很多年。
permGen空间定义为768M。
将其减少到128M