JVM内存问题排查

最近项目中出现了这样一个问题,有5台虚机上面运行着同样的微服务,每台机器都挂载着8-9个服务,其中一台不知道为什么就挂掉了,不是服务挂了,是机器挂了,shell连不上的那种。
初步诊断思路考虑是不是这台机器上的某个服务把内存撑爆了,所以开始排查内存问题,使用jdk自带脚本,进行内存诊断分析。
123test
1.查看所有Java应用占用的进程(linux常用的是ps -ef|grep java)

jps -l

在这里插入图片描述

2.查看需要监控进程垃圾回收情况,内存使用情况,这里主要看有没有full gc

jstat -gcutil 20954 1000

在这里插入图片描述

3.查看内存对应映射存活情况,这里主要查看对应的java进程有没有大对象,有大对象说明一直占用内存没有释放。

jmap -histo:live 20954 | head -10

在这里插入图片描述
4.生成dump文件快照,导出生成heap.hprof,用内存诊断工具MemoryAnalyzer导入这个dump文件查看分析具体是在哪里OOM,定位到具体的代码

jmap -dump:live,format=b,file=heap.hprof 20954 

在这里插入图片描述

PS:在查到java对应的进程后,也可以查找对应的是哪个线程占用内存异常,按照这种方法也可以排查。
首先得在windows安装pslist命令工具
第一步:进入https://technet.microsoft.com/zh-cn/sysinternals/dd443648工具压缩包下载
第二步: 解压后将pslist.exe复制到C:\Windows\System32目录下
第三步:dos窗口输入pslist,会弹出一个提示窗口提示同意并安装,安装后立马会列举出所有的进程列表

1.查看进程对应的线程

pslist -dmx 20954 

2.然后导出线程的stack文件分析

jstatck 10238 > 1.statck
发布了5 篇原创文章 · 获赞 1 · 访问量 99

猜你喜欢

转载自blog.csdn.net/iYhuitune/article/details/105339878
今日推荐