JVM学习(三)---heapDump导出与案例分析

在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等情况,这就是我们常说的dump文件。常用的有heap dump和thread dump(也叫javacore,或java dump)。我们可以这么理解:heap dump记录内存信息的,thread dump是记录CPU信息的。

        heap dump:

        heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Analyzer工具通过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。

        heap dump解析工具

       1 Jhat

       2 Memory Analyzer Mat(MAT)

       MemoryAnalyzer.ini修改heap size

       Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation

       https://www.cnblogs.com/zhihongShee/p/17461264.html

     【JVM】日志分析工具一Memory Analyzer Mat介绍和使用_memoryanalyzer_阿龙先生啊的博客-CSDN博客

        FUll GC: 频繁的FUll GC会导致CPU升高,并且服务被挂起

                      通过apache的访问日志可以看到访问情况,基本都是500错误,

                       而且最后一列的(apache LogFormat %D)相应时间会变得很长

        OOM:只会影响自己的线程,其他线程不受影

     jvm-Stop the world

Java中Stop-The-World机制简称STW,Java中一种全局暂停现象,多半由于GC引起。所谓全局停顿,就是所有Java代码停止运行,native代码可以执行,但不能与JVM交互。

  • 其危害是长时间服务停止,没有响应;对于HA系统可能引起主备切换,严重危害生产环境。

  • 目前垃圾收集器的优化方向基本上都是在尽量减少或者缩短Stop The World的时间。

jvm-Stop the world:https://blog.csdn.net/jakeswang/article/details/107673734



作者:小波同学
链接:https://www.jianshu.com/p/9a864233fd6c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  jvm-Stop the world_jvm stop the world-CSDN博客

            

        thread dump:

        thread dump文件主要保存的是java应用中各线程在某一时刻的运行的位置,即执行到哪一个类的哪一个方法哪一个行上。thread dump是一个文本文件,打开后可以看到每一个线程的执行栈,以stacktrace的方式显示。通过对thread dump的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,如数据库查询,长期得不到响应,最终导致系统崩溃。单个的thread dump文件一般来说是没有什么用处的,因为它只是记录了某一个绝对时间点的情况。比较有用的是,线程在一个时间段内的执行情况。

两个thread dump文件在分析时特别有效,困为它可以看出在先后两个时间点上,线程执行的位置,如果发现先后两组数据中同一线程都执行在同一位置,则说明此处可能有问题,因为程序运行是极快的,如果两次均在某一点上,说明这一点的耗时是很大的。通过对这两个文件进行分析,查出原因,进而解决问题。

jstack
jstack 是一个抓取 thread dump 文件的有效的命令行工具,它位于 JDK 目录里的 bin 文件夹下(JDK_HOME\bin),以下是抓取 dump 文件的命令:

jstack  <pid> > <file-path>
说明:

pid: Java 应用的进程 id ,也就是需要抓取 dump 文件的应用进程 id。

file-path: 保存 dump 文件的路径。
 

heap导出几种方式

  1、设置启动的JVM参数,当heap溢出时自动生成dump,vm options:-XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=${目录}

  2、jmap,命令:jmap -dump:live,file=D:/jvmdump/jmap.hprof [PID]

  3、jcmd,命令:jcmd <pid> GC.heap_dump D:/jvmdump/jmap.hprof

  4、jvisualvm或者jprofiler等可视化工具直接生成heap dump

参考:https://www.geeksforgeeks.org/how-to-generate-jvm-heap-memory-dump/

jstat

jstat命令命令格式:
jstat [Options] vmid [interval] [count]
 
命令参数说明:
Options,一般使用 -gcutil 或  -gc 查看gc 情况
pid,当前运行的 java进程号 
interval,间隔时间,单位为秒或者毫秒 
count,打印次数,如果缺省则打印无数次
 
Options 参数如下:
-gc:统计 jdk gc时 heap信息,以使用空间字节数表示
-gcutil:统计 gc时, heap情况,以使用空间的百分比表示
-class:统计 class loader行为信息
-compile:统计编译行为信息
-gccapacity:统计不同 generations(新生代,老年代,持久代)的 heap容量情况
-gccause:统计引起 gc的事件
-gcnew:统计 gc时,新生代的情况
-gcnewcapacity:统计 gc时,新生代 heap容量
-gcold:统计 gc时,老年代的情况
-gcoldcapacity:统计 gc时,老年代 heap容量
-gcpermcapacity:统计 gc时, permanent区 heap容量

示例 1:jstat -gc 30149 5000
说明:每5 秒一次显示进程号为30149的 java进成的 GC情况,结果如下图

在这里插入图片描述

S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
单位:KB



示例2:jstat -gcutil 30149 5000
说明:每5 秒一次显示进程号为30149的 java进程垃圾回收统计情况,结果如下图

 在这里插入图片描述


S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间



 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值