【发布时间】:2011-01-04 07:40:52
【问题描述】:
环境:
sun JDK 1.6.0_16
vm settings:
-XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -Xms1024 -Xmx1024M -XX:MaxNewSize=448m -XX:NewSize=448m -XX:SurvivorRatio=4(6 also checked) -XX:MaxPermSize=128M
OS: windows server 2003
processor: 4 cores of INTEL XEON 5130, 2000 Hz
我的申请说明: 每次提交到 oracle 时都会完成高强度的并发(使用 java 5 并发)操作。 大约有 20-30 个线程不停地运行,执行任务。
应用程序在 JBOSS Web 容器中运行。
我的 GC 开始正常工作,我看到很多小型 GC,并且一直以来 CPU 显示良好的负载,就像所有 4 个内核都加载到 40-50%,CPU 图表很稳定。
然后,经过 1 分钟的良好工作,CPU 开始在 2 个内核上从 4 个下降到 0%,它的图形变得不稳定,上升和下降(“牙齿”)。我看到,我的线程工作得更慢(我有监控),我看到 GC 在那段时间开始产生大量 FULL GC,接下来的 4-5 分钟这种情况保持不变,然后在短时间内,比如 1 分钟,它会恢复正常情况,但不久之后所有坏事都会重复。
问题: 为什么我的full GC这么频繁??? 如何预防?
我玩 SurvivorRatio - 没有帮助。
我注意到,该应用程序运行正常,直到第一次 FULL GC 发生,而我有足够的内存。然后它运行得很糟糕。
我的垃圾回收日志:
- 开始不错
- 然后是长时间的 FULL GC(其中很多)
1027.861: [GC 942200K->623526K(991232K), 0.0887588 secs]
1029.333: [GC 803279K(991232K), 0.0927470 secs]
1030.551: [GC 967485K->625549K(991232K), 0.0823024 secs]
1030.634: [GC 625957K(991232K), 0.0763656 secs]
1033.126: [GC 969613K->632963K(991232K), 0.0850611 secs]
1033.281: [GC 649899K(991232K), 0.0378358 secs]
1035.910: [GC 813948K(991232K), 0.3540375 secs]
1037.994: [GC 967729K->637198K(991232K), 0.0826042 secs]
1038.435: [GC 710309K(991232K), 0.1370703 secs]
1039.665: [GC 980494K->972462K(991232K), 0.6398589 secs]
1040.306: [Full GC 972462K->619643K(991232K), 3.7780597 secs]
1044.093: [GC 620103K(991232K), 0.0695221 secs]
1047.870: [Full GC 991231K->626514K(991232K), 3.8732457 secs]
1053.739: [GC 942140K(991232K), 0.5410483 secs]
1056.343: [Full GC 991232K->634157K(991232K), 3.9071443 secs]
1061.257: [GC 786274K(991232K), 0.3106603 secs]
1065.229: [Full GC 991232K->641617K(991232K), 3.9565638 secs]
1071.192: [GC 945999K(991232K), 0.5401515 secs]
1073.793: [Full GC 991231K->648045K(991232K), 3.9627814 secs]
1079.754: [GC 936641K(991232K), 0.5321197 secs]
【问题讨论】:
-
提示 - 为预格式化代码(例如您的 GC 日志)缩进四个空格。
-
为什么只有
1024M?您是否有机会运行 32 位 JVM?
标签: java multithreading jboss garbage-collection