最近一个项目发到测试服务器上后,分配了Xmx2048m,但是隔了一晚永久代都满了,肯定是有内存泄露。
就开始使用常用的方式开始查找问题
命令: jmap -heap PID 可查看java堆内存中的存储状态,如下图:
命令: jstat -gcutil 可查看垃圾回收状态,如下图:
虽然当时发现,确实在频繁执行内存回收,但不知道原因;
最开始发现CPU占用很高,
然后先用ps -mp 【替换为进程ID PID】 -o THREAD,tid,time
或者 top -Hp 找到cpu占用高的线程
使用 jstack 【进程ID PID】 | grep 【线程ID十六进制】 -A 10 -B 10 命令可查看线程情况,
最后发现都是垃圾回收的线程。
最后还是用 jmap -dump:format=b,live,file=aa.bin 1355384 把内存映射文件下载下来了,然后用jvisualvm导入查看情况,发现了大量的nacos的线程。此时应该知道是nacos的问题。
为了确认还是将dump文件上传到了heapHero上进行分析:
最后看到有一个对象占了 90%的内存,最后还是定位到nacos的问题;
然后检查发现代码中用的nacos client是2.0.4的,nacos server是2.0.3的,然后把client也换乘了2.0.3,目前跑了一晚没有问题。但是由于时间问题没来得及分析源码哪里导致的问题,后续有时间了再看吧。。。。。