尽管Java内存足够,为什么会重复进行Java垃圾回收?

7
我们的Java进程占用了大量CPU资源,日志显示它经常进行垃圾回收(GC),尽管已使用内存约为5GB(从JMX控制台中获取),最小和最大内存为10GB。
我们的JVM参数是:JVM_GC =“-verbose:gc -Xnoclassgc -XX:+ PrintGCDetails -XX:+ UseParNewGC -XX:NewSize = 3GB -XX:ParallelGCThreads = 8 -XX:MaxTenuringThreshold = 15 -XX:+ UseConcMarkSweepGC”,MinHeap = MaxHeap = 10GB。
有什么想法可能会触发GC?为什么它发生得太频繁和太快?由于它是生产环境,我们无法连接任何性能分析工具,除了通过JMX获取一些设置...谢谢
..... GC日志....

@2011-07-20 02:10:46
[系统全GC(CMS)[CMS:3333423K->4019122K(7340032K),13.4979250秒] 4876606K->4019122K(10171200K),[CMS Perm:21656K->21608K(21824K)],13.4980930秒][时间:用户=12.99 sys=0.50,real=13.50秒]
[GC [1 CMS-initial-mark: 4019122K(7340032K)] 4041525K(10171200K),0.0009110秒] [时间:用户=0.00 sys=0.00,real=0.00秒]
@2011-07-20 02:11:10
[CMS-concurrent-mark: 10.322/10.753秒] [时间:用户=21.55 sys=0.22,real=10.75秒]
[CMS-concurrent-preclean: 0.035/0.036秒] [时间:用户=0.04 sys=0.00,real=0.04秒]
@2011-07-20 02:11:15
CMS:由于时间而中止预清理[CMS-concurrent-abortable-preclean: 1.083/5.063秒] [时间:用户=1.08 sys=0.00,real=5.06秒]
[GC [YG占用:282204 K(2831168 K)][重新扫描(并行),0.0402030秒][弱引用处理,0.0010550秒]
[1 CMS-remark: 4019122K(7340032K)] 4301326K(10171200K),0.0413630秒] [时间:用户=0.07 sys=0.01,real=0.04秒]
@2011-07-20 02:11:16
[CMS-concurrent-sweep: 2.627/2.627秒] [时间:用户=2.63 sys=0.00,real=2.63秒]
[CMS-concurrent-reset: 0.039/0.039秒] [时间:用户=0.04 sys=0.00,real=0.04秒]
@2011-07-20 02:11:20
[GC [1 CMS-initial-mark: 4019034K(7340032K)] 4301238K(10171200K),0.0308450秒] [时间:用户=0.03 sys=0.00,real=0.03秒]
@2011-07-20 02:11:30
[CMS-concurrent-mark: 10.304/10.307秒] [时间:用户=20.48 sys=0.11,real=10.31秒]
[CMS-concurrent-preclean: 0.018/0.019秒] [时间:用户=0.02 sys=0.00,real=0.01秒]
@2011-07-20 02:11:35
CMS:由于时间而中止预清理[CMS-concurrent-abortable-preclean: 1.043/5.048秒] 时间:用户=1.03 sys=0.00,real=5.05秒]
[GC [YG占用:282204 K(2831168 K)][重新扫描(并行),0.0419560秒][弱引用处理,0.0010880秒]
[1 CMS-remark: 4019034K(7340032K)] 4301238K(10171200K),0.0431480秒] [时间:用户=0.07 sys=0.01,real=0.05秒]
@2011-07-20 02:11:38
[CMS-concurrent-sweep: 2.622/2.622秒] [时间:用户=2.63 sys=0.00,real=2.62秒]
[CMS-concurrent-reset: 0.039/0.039秒


G1回收器是一种紧凑的有限生命周期垃圾收集器,如果你可以试用它的话。 - Peter Lawrey
1
也许你的旧一代已经接近满了,尝试给它更多的空间。 - irreputable
2个回答

4
尝试使用UseCMSInitiatingOccupancyOnly和CMSInitiatingOccupancyFraction标志进行操作。使用这些标志,将根据占用情况触发启动CMS收集。此外,可能有必要增加旧生代的大小。

是的,当UseCMSInitiatingOccupancy达到68%且消息流量速率经常推至68%时,CMS会被触发。问题就出在这里了,你说对了。 - Dhana Krishnasamy
您可以查看此位置以获取详细信息:https://dev59.com/NGkw5IYBdhLWcg3ws873 - RRM

3

内存碎片化怎么办?并发标记和清除不会压缩内存,最终它可能变得非常碎片化 - 因此尽管您拥有足够的总空间,但可能没有足够的空间来分配新对象; 因此启动GC。


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