当前位置:编程学习 > JAVA >>

一个奇怪的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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,