记一次tomcat假死问题

编程

服务器用的tomcat突然发现运行缓慢。查看服务器 cpu:95% 硬盘:30%。整个服务卡的压根动不了。

故准备使用eclipse memory analyzer  分析一下,下面是使用的命令。

首先在服务器上使用命令简单查看一下:

1.使用top -Hp 进程号 查看一下占用高的进程,并选取其中占用资源高的线程

2.jstack 进程号> ./jstack.log 记录jstack日志到当前目录  --jstack命令需要在jdk的bin目录下执行,并且必须要以当前启动项目tomcat的用户身份运行

3.printf "%x

" 线程号   打印出线程的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/

以上是 记一次tomcat假死问题 的全部内容, 来源链接: utcz.com/z/511877.html

回到顶部