线上 Dump
优质博文:IT-BLOG-CN
一、简介
机器宕机或者请求很慢最常出现的几种问题:针对代码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 Recorder
和JDK 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
文件,JVM
启动时添加参数:
#出现OOM时生成堆Dump
-XX:+HeapDumpOnOutOfMemoryError
#生成堆文件地址
-XX:HeapDumpPath=/home/xxx/logs/
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"
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 &
Windows Tomcat
:打开/tomcat_home/bin/catalina.bat
文件
set JAVA_OPTS=%JAVA_OPTS% -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump
在JProfiler
的堆遍历器Heap Walker
中,你可以对堆的状况进行快照并且可以通过选择步骤下寻找感兴趣的对象。堆遍历器有五个视图:
【1】类Classes
: 显示所有类和它们的实例,可以右击具体的类Used Selected Instance
实现进一步跟踪。
【2】分配Allocations
: 为所有记录对象显示分配树和分配热点。
【3】索引References
: 为单个对象和显示到垃圾回收根目录的路径提供索引图的显示功能。还能提供合并输入视图和输出视图的功能。
选择需要查看的大对象,右键选择Use Selected Objects
incoming references
显示这个对象被谁引用; outcoming references
显示这个对象引用的其他对象
查看
查看Graph
【4】时间Time
: 显示一个对已记录对象的解决时间的柱状图。
【5】检查Inspections
: 显示了一个数量的操作,将分析当前对象集在某种条件下的子集,实质是一个筛选的过程。