FGC 次数 19529 次!!!何等的恐怖!!!!!
命令: jstat -gcutil 30069 1000
(小记,排查cpu100%,top 看进程cpu, top -Hp PID 看进程内线程cpu占用, 转成16进制,用jstack查看)
Node模块启动后收到请求却未能响应。 一直在频繁的FGC。新生代内存爆满。老年代内存爆满!
这是什么???
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跑一两天就完蛋!!
public class NodeContext{ private static NodeContext ourInstance = new NodeContext(); //存储用户的代码 private static Map<String, Code> codesMap; public static NodeContext singleton() { return ourInstance; } private NodeContext() { codesMap = new ConcurrentHashMap<>(); scheduler = SchedulerFactory.singleton().createOrGetParallelScheduler(NodeConfig.PARALLELISM_MAX_NUM); }
}
解决过程中又遇到了一个坑!!!
错误解决:在一个实例运行完的代码finally部分调用NodeContext.remove(codeId) 移除掉这个运行的实例!!!
发布测试环境!!! 运行报错!!!!
正确解决:
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
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
[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