【发布时间】:2012-06-28 21:26:43
【问题描述】:
我遇到了垃圾收集问题,在我们的系统上,垃圾收集时间一直呈线性上升,直到达到大约 25 秒的常数。
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 84.18 76.65 35.47 60.16 441 15.581 16 1.834 17.415
75.72 0.00 97.32 35.47 60.16 442 15.770 16 1.834 17.604
0.00 64.69 35.56 35.86 60.16 443 16.318 16 1.834 18.153
100.00 0.00 19.91 35.87 60.16 444 16.381 16 1.834 18.215
0.00 70.61 40.85 36.82 60.17 445 17.488 16 1.834 19.322
28.80 0.00 19.61 36.82 60.17 446 17.535 16 1.834 19.369
34.51 0.00 48.01 36.82 60.18 448 17.561 16 1.834 19.395
0.00 10.86 20.48 37.11 60.21 453 17.979 16 1.834 19.813
9.04 0.00 47.39 37.12 60.23 454 18.063 16 1.834 19.898
0.00 71.26 2.65 37.14 60.23 455 18.173 16 1.834 20.007
63.64 0.00 90.91 38.04 60.23 456 19.562 16 1.834 21.396
0.00 76.45 42.70 38.04 60.23 457 19.592 16 1.834 21.426
这只是我执行一个小负载测试时的活动快照。
我查看了一些快照,但我不是专家,但实际上确实发现了一些内存问题。显而易见的问题现已解决。
机器有以下设置
JAVA_OPTS="$JAVA_OPTS
-server
-Xms704m
-Xmx704m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/tomcat6
-XX:MaxPermSize=192m
-XX:+UseConcMarkSweepGC
-XX:+CMSIncrementalMode
-XX:+CMSIncrementalPacing
-XX:+DisableExplicitGC
"
我们使用 Java 6、Tomcat6、Spring Framework、Hibernate、EHCache 进行缓存,并使用 Quartz 进行各种调度任务。 link 这个项目实际上帮助解决了一些确实导致 MAT 报告潜在内存泄漏的问题,但现在情况已不再如此。
我们在测试盒上使用了各种 JVM 设置,但在所有情况下,垃圾收集时间一直增长到无法接受的水平,这主要是因为 YGCT 不断增长。最初,我认为缓存是罪魁祸首,因为我们缓存对象图,而不仅仅是使用 Hibernate 二级缓存。但是 MAT 中缓存的内存使用量在 18Mbs 左右时似乎并不过分。
这是内存泄漏,还是我应该向它扔更多内存?如果是内存泄漏,我怎样才能最好地在 MAT 中调试?
【问题讨论】:
-
为什么 -Xms 和 -Xmx 相等?理想情况下它不应该相等。