一个奇怪的GC
执行 jstat -gctuil 每个1秒打印gc结果有较长一段时间 (大约20分钟) s0 s1 占用0%, eden 占用 100% PSOld 占用 100 此时fullgc频繁执行,fullgc后又是 eden 会回收些 70% 有时回收不了 还是100% 整个过程 s0 s1 都是0%
jmap -heap 查看堆使用情况如图
jvm参数:
-Xms2046m -Xmx5096m -XX:PermSize=256m -XX:MaxPermSize=512m
jdk版本:
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03, mixed mode) GC --------------------编程问答-------------------- 补充下 随着时间推移在红框区域 突然 gc恢复正常, 未恢复前程序很卡 但是cpu不高。 第二张图是在恢复正常后的 heap 占用情况 这里贴出来主要是 看下 堆的参数 --------------------编程问答-------------------- 这个很正常吧,你看最右一栏是GC总时间,前面那一堆100%的时候并没有GC执行,而红框中那一段由100变到71.85应该是有一些被回收,有一些从eden移到了old。程序要优化 --------------------编程问答-------------------- 2152这一列是young GC,你看它的值递增很快,到最后一行都是2159了。
young GC控制的是前3列的内存回收。
690这一列才是full GC,奇怪的是在你红色区域虚拟机应该做一次full GC,可是没见到690变成691。但是old区从100%降低到了70%多。
另外估计和楼主的内存这是的太大了也有关系,
-Xms2046m -Xmx5096m -XX:PermSize=256m -XX:MaxPermSize=512m
这个参数太不合理了吧?为什么你的程序要分配这么多的内存?32位操作系统最多能用4G内存吧。
如果你的程序有内存泄露,这个值分配的再多也没用。 --------------------编程问答-------------------- 建议将-Xms2046m -Xmx5096m这个值调小,看看你的程序会不会有OutOfMemory的错误。
如果有,需要jmap导出内存文件,再使用工具分析内存泄露的地方。 --------------------编程问答-------------------- 单纯从百分比看可能并不十分准确,java会动态增加或减少堆内存的大小。
jstat -gc可能会看的清楚一点。
补充:Java , Java SE