标签:
刚上线了一个新的应用集群,第二天和第三天收到了应用FullGc超过阈值的报警短信。但是观察报警Java实例的jvm监控,堆内存仅仅用了1G多一点,还富余近700M。很困惑,剩余这么多内存没被使用,那么说明老年代内存是充足的才对啊!
针对报警的实例进程执行jstat -gcutil 命令,拿到了这个java进程的内存个个代的使用百分比。
发现P的使用率是98%,P,即 Permanent Generation,永久代。也就是说永久代的使用率已经超过了98%。于是问题明了了。FullGc,大家很容易想到的是Old Generation内存爆了导致的!但是这不是唯一的条件,永久代内存回收也是归FullGc管的!于是强烈建议我们的监控界面添加永久代的监控。
再针对这个实例执行 jstat -gccapacity pid 命令,发现这个实例的永久代仅仅给了82M。82M意味着什么,永久代的默认堆内存大小。
果断添加JVM的永久代参数,-XX:PermSize=512M -XX:MaxPermSize=512M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/im.**.com/ 。顺便加上对内存OOM的自动dump参数。
标签:
原文地址:http://blog.csdn.net/bruce128/article/details/46237513