# 一、简介

机器宕机或者请求很慢最常出现的几种问题:针对代码bug或者qps过高造成的。
【1】cpu过高致内存耗尽OOM,堆区对象回收不过来cpu被打满
【2】死锁抢用资源导致cpu过高致耗尽
【3】内存泄漏: 堆内存由于某种原因未释放或无法释放,造成系统内存浪费,严重致宕机(基本上很少)

排查过程(推荐第3种):
【1】arthas诊断工具包:线上诊断程序利器,由于arthas包上传不了不符合现在流程所以采用不了。主要用途在于排查程序jvm问题,包版本与预想不一致问题等
【2】eclipse memory analyzer : 导入dump文件分析,小文件正常分析,一旦文件上G以上,就会出现文件过大问题,就算有方案也是很复杂
【3】采用JProfiler工具排查:下面详细说明

# 二、JFR 是什么

Java Flight Recorder 飞行记录仪是JMC的其中一个组件,能够以极低的性能开销收集Java虚拟机的性能数据。与其他工具相比,JFR的性能开销很小,在默认配置下平均低于1%JFR能够直接访问虚拟机内的数据并且不会影响虚拟机的优化。因此它非常适用于生产环境下满负荷运行的Java程序。

Java Flight RecorderJDK Mission Control共同创建了一个完整的工具链。JDK Mission Control可对Java Flight Recorder连续收集低水平和详细的运行时信息进行高效、详细的分析。

当启用时JFR将记录运行过程中发生的一系列事件。其中包括Java层面的事件,如线程事件、锁事件,以及Java虚拟机内部的事件,如新建对象,垃圾回收和即时编译事件。按照发生时机以及持续时间来划分,JFR的事件共有四种类型,它们分别为以下四种:
 ■ 瞬时事件Instant Event: 用户关心的是它们发生与否,例如异常、线程启动事件。
 ■ 持续事件Duration Event: 用户关心的是它们的持续时间,例如垃圾回收事件。
 ■ 计时事件Timed Event: 是时长超出指定阈值的持续事件。
 ■ 取样事件Sample Event: 是周期性取样的事件。

取样事件的其中一个常见例子便是方法抽样Method Sampling,即每隔一段时问统计各个线程的栈轨迹。如果在这些抽样取得的栈轨迹中存在一个反复出现的方法,那么我们可以推测该方法是热点方法。

Java Flight Recorder 飞行记录仪是是一种内置在JVM中,在运行时对IO、堆栈分配、GC、锁信息等metrics进行埋点的工具。目前只有Captain发布可以自定义镜像,且一个AppId只对应一个Base Image,所以需要使用以下这种较为繁琐的方式。等框架的多镜像功能上线操作会更简单。

最新版本12的注册码key:A-J12-pedoc#455172-msk2a0m2ucvtr#48b4b7

# 三、JFR镜像分析

生成镜像: 找到需要生成镜像的那次提交,按下图找到对应的Image Job,然后点击重试按钮。Pipeline Rerun完成后,立刻将2.1步骤中的配置还原,请保证该时间段内Captain自动生成的任何其他镜像都不会被用于生产环境。线上这个下载会有好几g大内容,最大不会出现内存大小,所以会有一定下载时间

Dump

生成Dump文件,JVM启动时添加参数:

#出现OOM时生成堆Dump
-XX:+HeapDumpOnOutOfMemoryError
#生成堆文件地址
-XX:HeapDumpPath=/home/xxx/logs/
1
2
3
4

Linux Tomcat:打开/tomcat_home/bin/catalina.sh文件,其中不设-XX:HeapDumpPath时,dump出的文件在/tomcat_home/bin目录下

JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -server -Xms6144m -Xmx6144m -XX:NewSize=384m -XX:MaxNewSize=450m -XX:PermSize=128m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/zyf/logs"
1

Linux SpringBoot:

nohup java -Xms2048m -Xmx2048m -XX:NewSize=384m -XX:MaxNewSize=450m -XX:PermSize=128m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/darren/logs/ -jar test.jar --spring.profiles.active=prod &
1

Windows Tomcat:打开/tomcat_home/bin/catalina.bat文件

set JAVA_OPTS=%JAVA_OPTS% -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump
1

JProfiler的堆遍历器Heap Walker中,你可以对堆的状况进行快照并且可以通过选择步骤下寻找感兴趣的对象。堆遍历器有五个视图:
【1】类Classes 显示所有类和它们的实例,可以右击具体的类Used Selected Instance实现进一步跟踪。

Dump

【2】分配Allocations 为所有记录对象显示分配树和分配热点。
【3】索引References 为单个对象和显示到垃圾回收根目录的路径提供索引图的显示功能。还能提供合并输入视图和输出视图的功能。

选择需要查看的大对象,右键选择Use Selected Objects

Dump

incoming references显示这个对象被谁引用; outcoming references显示这个对象引用的其他对象

Dump

查看

Dump

查看Graph

Dump

【4】时间Time 显示一个对已记录对象的解决时间的柱状图。
【5】检查Inspections 显示了一个数量的操作,将分析当前对象集在某种条件下的子集,实质是一个筛选的过程。

Dump
(adsbygoogle = window.adsbygoogle || []).push({});