jvm线上内存问题排查

时间:2022-07-24
本文章向大家介绍jvm线上内存问题排查,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

背景:

正在和同事在外面吃饭,突然钉钉报警,有一个服务的机器内存飙到百分之90%多。和同事大概聊了一下说是队列累积,机器消费不过来,具体原因也没有深问,又一同事,说看一下是那个对象占的内存,使用jmap,jstat。当时我也在旁边围观,由于之前有看过,我就说jmap在生产环境敢使用吗?

jmap,jstat的作用?

  1. jmap 是内存影像工具,jmap用于生成堆转储快照(一般称为dump或者heapdump文件)也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
  2. 使用参数
-XX:+HeapDumpOnOutOfMemoryError

,可以让虚拟机在 OOM 异常出现之后自动生成 dump 文件 使用参数

-XX:+HeapDumpOnCtrlBreak

然后使用 Ctrl+Break 生成 在 Linux 系统中使用 kill -3 发送进程退出信号“吓唬”虚拟机,让其生成 dump 文件)

2. jstat (JVM statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具他可以显示本地或者远程虚拟机进程中的类装载,内存,垃圾收集,JIT编译等运行数据,在没有GUI图形界面 ,只提供了纯文本控制台环境的服务器上,他是运行期定位虚拟机的首选工具(周志明说)

jmap实战

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lQojpBgg-1587553128990)(CF4BE02FA6C941DEB23E041B50C4FAE7)]

  1. 首先我们使用jps命令查看当前运行在JVM上的应用的LVMID也就是我上图的28398
  2. 拿到这个后使用jmap -dump命令
jmap -dump:format=b,file=dumpHeap.bin 28398
  1. 执行成功后使用ll就可以看到dump 下来的文件
  2. 接下来我们可以使用其他的分析工具进行分析 如:jhat ,Visual VM,MAT等。周志明说:能用其他工具就不要用jhat原因是:一般不会在部署应用的服务器上进行分析dump文件,分析dump文件是一件非常耗费硬件资源的过程,第二个原因就是jhat很简陋。所以还是使用将多个功能放在一块的工具Visual VM来进行分析。

Tips : 但是这个dump在生产环境中还是慎用,因为在dump文件的过程中为保证文件的准确性会停止所有的进程的(个人觉得有点类似于gc 中的stop the word)

jstat 实战

  1. jps获取服务的LVMID
  2. jstat -gc
  3. 我们从图中可以观察到 其中 S0 和 S1 指 Survivor0 区和 Survivor1区,E 即 Eden 区,O 指老年代,M 指 MetaSpace,元数据空间,CCS 是压缩使用比例,YGC:年轻代垃圾回收次数,FGC:老年代垃圾回收次数,FGCT:老年代垃圾回收消耗时间,GCT:垃圾回收消耗总时间。当我们拿到了生产上的信息,且进行了分析,那我们就得查看现有的配置。那就是用jinfo

jinfo实战

  1. 不管怎样我们都得查找到LVMID
  2. 通过jinfo查看得到该应用程序的现有配置。
  3. 或者说我们使用的jekins自动化构建工具那我们可以在
cd /usr/local/deploy/supervisord/conf/项目对应的conf文件
  1. cat 文件进行查看 应用的启动配置的配置文件。

其实不是不可以使用jmap而是jmap -dump的使用的时候需要注意。有可能会导致服务停止!!