前几天线上一台游戏服务器发生内存泄漏,cpu彪的很高,老板的脾气像cpu一样,是不是过来询问问题排查怎么样了。。。
因为线上服务器启动的时候,加了- XX:+ HeapDumpOnOutOfMemoryError ,发现服务器项目目录下多一个hprof文件,这就是重要的线索,然后解析xxx.hprof这个文件,方法很多,
(1)、可以使用JHAT,这是JDK默认提供的Java堆分析工具,jhat -port 1123 -J-Xmx4G dump.hprof
(2)、可以使用第三方工具,Eclipse Analyzer 性能分析工具
(3)、这里我使用的jprofier 工具打开java_pidxxx.hprof
可以看到的信息是这2列:
然后再Thread Dump 中发现了异常;
看到那个闪电标识了吗⚡,这就是问题发生的瞬间的一个快照dump时刻的记录,找到问题了,是并发导致的内存泄漏,
一个map.一个线程往里面put,一个线程在使用map:
Collection<V> valueCollection =Map.get(outRankType).values();
List<V> valueList = new ArrayList<>(valueCollection);
new ArrayList<>(valueCollection) 和map.put并发问题导致内存泄漏,其实就是 new ArrayList<>(valueCollection)里面并发导致了死循环,这2个线程也就蹦了,这2个线程处于阻塞状态,导致任务处理不了。
写代码的人找不到了,但是锅还是得背啊,老板只看结果,haha。。。后面又加了报警机制,,,,