使用MemoryAnalyzer来排查Java OutOfMemory问题

使用MemoryAnalyzer来排查Java OutOfMemory问题

工具

arthas

MemoryAnalyzer

JDK17

准备

新版MemoryAnalyzer需要JDK17环境,手动下载JDK17并解压,然后在MemoryAnalyzer.exe执行程序目录下,找到MemoryAnalyzer.ini并编辑,在前面加上(第二行换成jdk17的地址):

-vm
C:\Users\Administrator\.jdks\corretto-17.0.7\bin\javaw.exe

完事保存即可

步骤

  1. 使用获取jvm heap dump文件,注意:主动获取操作会使服务暂时卡住,非必要时慎用

    1. 使用arthas获取

      java -jar arthas-boot.jar
      # 选择进程后输入下面语句,后面为dump输出路径
      heapdump /tmp/dump.hprof
    2. 使用java自带的jmap获取

      # 最后跟的是jvm进程号
      jmap -dump:file=/tmp/dump.hprof 需要DUMP的jvm进程号
      # format=b指定为二进制格式文件
      jmap -dump:format=b,file=/tmp/dump.hprof 需要DUMP的jvm进程号

    注意heap文件大小会等于jvm的heap大小,需要保证磁盘空间足够

  2. 打开MemoryAnalyzer,注意MemoryAnalyzer的内存配置需要大于这个dump文件的大小,否则可能会卡死,内存配置在ini文件中改,最后一行-Xmx4096m
  3. 点击File-Open Heap Dump,打开dump文件,之后程序会加载并分析heap文件,耐心等待即可
  4. List Object查看所有对象image-20230802134755012
  5. 点击一下Retained Heap即可按照对象占用内存大小进行排序image-20230802134821216
  6. 最后发现是spire.pdf中内存没有释放,回去查找对应代码修改即可

    image-20230802135001904

评论区
头像
文章目录