服务器用的tomcat突然发现运行缓慢。查看服务器 cpu:95% 硬盘:30%。整个服务卡的压根动不了。
故准备使用eclipse memory analyzer 分析一下,下面是使用的命令。
首先在服务器上使用命令简单查看一下:
1.使用top -Hp 进程号 查看一下占用高的进程,并选取其中占用资源高的线程
2.jstack 进程号> ./jstack.log 记录jstack日志到当前目录 --jstack命令需要在jdk的bin目录下执行,并且必须要以当前启动项目tomcat的用户身份运行
3.printf "%x\n" 线程号 打印出线程的16进制码
4.grep -rn 16进制码~/jvm.stack.log -A 100 查找该线程在日志中的记录
5.我这次问题查看到是gc出了问题 但是具体不知道是哪 故导出dump文件使用软件分析一下 jmap -head 10735 发现 年轻代和老年代都满了。
6. jmap -dump:format=b,file=10735.bin 10735 10735 是我的进程号 ,然后把文档当下来
7.打开mat ,内存最好调高点 最低要高过dump文件大小。
8.先用dominator_tree看了下哪些线程占用空间大 ,我这发现 有4个线程占用了几乎99%的内存。然后打开发现里面有个arraylist存了2千万数据,这不gg?
9.然后使用leak suspects 自动分析下哪个问题最大
查看了一下果然报错接口的数据跟 2千万条数据有关。 查看代码发现 有可能造成死循环 不停存数据 还每次创建 dateformat。这个玩意可是并发老阻塞了。
告诉开发 完善代码。
以后最好加上-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/heap 生成dump文件 不过生产加了还好。
参考资料:https://eclipsesource.com/blogs/2013/01/21/10-tips-for-using-the-eclipse-memory-analyzer/