大家好,又见面了,我是你们的朋友全栈君。
现象:
现象截图:
内存:
命令: jmap -heap 30069
GC截图:
FGC 次数 19529 次!!!何等的恐怖!!!!!
命令: jstat -gcutil 30069 1000
(小记,排查cpu100%,top 看进程cpu, top -Hp PID 看进程内线程cpu占用, 转成16进制,用jstack查看)
现象描述:
Node模块启动后收到请求却未能响应。 一直在频繁的FGC。新生代内存爆满。老年代内存爆满!
开始分析:
可是。。。。。。。运行一两天后,Node再次未响应!!!!看来之前的解决方法是 错的!!错的!!错的!!
根本不是什么堆空间大小的问题。
num #instances #bytes class name
----------------------------------------------
1: 1001750 155802576 [B
2: 137954 32307952 [C
3: 983424 23602176 java.util.LinkedList$Node
4: 134617 3230808 java.lang.String
5: 34867 3091056 [Ljava.util.HashMap$Node;
6: 74748 2391936 java.util.HashMap$Node
7: 34156 1639488 java.util.HashMap
8: 8932 1523896 [Ljava.lang.Object;
9: 8216 1508664 [Ljava.util.concurrent.ConcurrentHashMap$Node;
10: 16393 1311440 org.apache.zookeeper.data.Stat
11: 35150 1124800 java.util.concurrent.ConcurrentHashMap$Node
12: 7604 847288 java.lang.Class
13: 49187 786992 java.util.concurrent.atomic.AtomicReference
14: 16393 655720 org.apache.curator.framework.recipes.cache.TreeCache$TreeNode
15: 1704 640704 java.lang.Thread
16: 8373 535872 java.util.concurrent.ConcurrentHashMap
17: 33135 530160 java.util.HashSet
这是什么???
1: 1001750 155802576 [B
果断看不出这是什么?
回忆一下:
比较明显的现象:
1. O区满的。
2. E区却没有满。
[deploy@dipper_prd_2 ~]$ jstat -gccause 26003 1000
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
0.00 0.00 58.63 99.93 97.37 96.66 280 6.302 111 37.851 44.153 Allocation Failure No GC
3.FGC 次数增了,YGC倒是没有增长。
E区没满,O却满了。!!有什么奇怪的东西跑进了O区吗???????看了一下代码。最近Node修改的只有日志。读日志!!读日志 生成的对象 E没满 并不会进O区! 排除读日志的影响!
那 到底是什么奇怪的东西进入了O区??
看了一圈代码。发现不了问题。。
只能用终极大法了。dump堆内存分析。
dump堆内存到文件中 通过MAT软件分析。
命令: jmap –dump:format=b,file=jconsole.dump 26003
安装好eclipse的memory analysis tool (MAT),切换成mat视图。将文件导入到eclipse中。
不分析不知道。 一分析吓一跳!! 看到没有,内存中最大的那块区域!!是一个concurrentHashMap!!!!!!!!!
原来是有个concurrentHashMap在作怪!!
为什么这个对象会占据如此多的内存!查看代码后发现。这个concurrentHashMap 在NodeContext中。
这个数据结构存储了所有运行的作业的信息。 每新进一个 作业,会在此结构添加一个Code对象。
然而。 从未调用过remove方法!!!!!! 这块又是个单例对象的static对象,从来不会被回收。只进不出,内存溢出!Node跑一两天就完蛋!!
} |
---|
解决:
解决过程中又遇到了一个坑!!!
错误解决:在一个实例运行完的代码finally部分调用NodeContext.remove(codeId) 移除掉这个运行的实例!!!
发布测试环境!!! 运行报错!!!!
正确解决:
在监听实例 上报状态到ZK后再做 这个移除操作!!!
修改后的现象:
第一天:
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC 0.00 18.29 97.31 50.26 97.42 95.25 41 0.855 2 0.393 1.247 Allocation Failure No GC 0.00 18.29 97.80 50.26 97.42 95.25 41 0.855 2 0.393 1.247 Allocation Failure No GC 0.00 18.29 99.27 50.26 97.42 95.25 41 0.855 2 0.393 1.247 Allocation Failure No GC 21.00 0.00 0.07 50.27 96.99 95.31 42 0.879 2 0.393 1.272 Allocation Failure No GC 21.00 0.00 0.89 50.27 96.99 95.31 42 0.879 2 0.393 1.272 Allocation Failure No GC 21.00 0.00 2.12 50.27 96.99 95.31 42 0.879 2 0.393 1.272 Allocation Failure No GC 21.00 0.00 2.95 50.27 96.99 95.31 42 0.879 2 0.393 1.272 Allocation Failure No GC 21.00 0.00 3.91 50.27 96.99 95.31 42 0.879 2 0.393 1.272 Allocation Failure No GC 21.00 0.00 4.49 50.27 96.99 95.31 42 0.879 2 0.393 1.272 Allocation Failure No GC 21.00 0.00 5.10 50.27 96.99 95.31 42 0.879 2 0.393 1.272 Allocation Failure No GC |
---|
第二天:O区只增长了2%
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC 0.00 97.82 50.26 52.21 97.59 95.44 53 1.012 2 0.393 1.405 Allocation Failure No GC 0.00 97.82 50.26 52.21 97.59 95.44 53 1.012 2 0.393 1.405 Allocation Failure No GC 0.00 97.82 50.26 52.21 97.59 95.44 53 1.012 2 0.393 1.405 Allocation Failure No GC 0.00 97.82 50.26 52.21 97.59 95.44 53 1.012 2 0.393 1.405 Allocation Failure No GC 0.00 97.82 50.26 52.21 97.59 95.44 53 1.012 2 0.393 1.405 Allocation Failure No GC 0.00 97.82 50.26 52.21 97.59 95.44 53 1.012 2 0.393 1.405 Allocation Failure No GC 0.00 97.82 50.27 52.21 97.59 95.44 53 1.012 2 0.393 1.405 Allocation Failure No GC 0.00 97.82 50.27 52.21 97.59 95.44 53 1.012 2 0.393 1.405 Allocation Failure No GC 0.00 97.82 50.27 52.21 97.59 95.44 53 1.012 2 0.393 1.405 Allocation Failure No GC |
---|
若干天后:发生了一次FGC 但是 O区已经降低至 30.18% 到此,成功解决此内存溢出的问题!!!
[deploy@dipper_prd_2 ~]$ jstat -gcutil 3519 1000 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 4.45 65.14 30.18 96.89 93.87 671 5.568 3 0.742 6.310 0.00 4.45 65.14 30.18 96.89 93.87 671 5.568 3 0.742 6.310 0.00 4.45 65.14 30.18 96.89 93.87 671 5.568 3 0.742 6.310 0.00 4.45 65.15 30.18 96.89 93.87 671 5.568 3 0.742 6.310 0.00 4.45 65.15 30.18 96.89 93.87 671 5.568 3 0.742 6.310 0.00 4.45 65.15 30.18 96.89 93.87 671 5.568 3 0.742 6.310 0.00 4.45 65.15 30.18 96.89 93.87 671 5.568 3 0.742 6.310 0.00 4.45 65.15 30.18 96.89 93.87 671 5.568 3 0.742 6.310 0.00 4.45 65.18 30.18 96.89 93.87 671 5.568 3 0.742 6.310 0.00 4.45 65.18 30.18 96.89 93.87 671 5.568 3 0.742 6.310 |
---|
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150781.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...