作为Java程序员能够实时获取到线上服务堆栈信息是一个非常重要的技能,也可以极大帮助我们定位线上问题以及发现服务中的隐藏故障。
dump服务的堆栈信息主要有两种渠道,分别是自动生成dump文件和手动生成dump文件。
一、自动生成dump文件
顾名思义,当程序中出现内存溢出或者gc的时候系统会自动dump出堆栈信息到指定路径文件中。
为了实现上述功能需要在jvm启动参数中添加如下的配置
1. -XX:+HeapDumpOnOutOfMemoryError
当OutOfMemoryError发生时自动生成 Heap Dump 文件。
当你需要分析Java内存使用情况时,往往是在OOM(OutOfMemoryError)发生时。
2. -XX:+HeapDumpBeforeFullGC
当 JVM 执行 FullGC 前执行 dump。
3. -XX:+HeapDumpAfterFullGC
当 JVM 执行 FullGC 后执行 dump。
4. -XX:+HeapDumpOnCtrlBreak
交互式获取dump。在控制台按下快捷键Ctrl + Break时,JVM就会转存一下堆快照。
5. -XX:HeapDumpPath=/opt/logs/dumplogs
指定 dump 文件的存储路径
二、手动生成dump文件
主要的步骤如下:
1.登录上有问题的机器并获取到相应的root权限。
2.通过top指令知道需要dump的java进程
3.开始dump文件。命令:jmap -dump:file=文件名.hprof,format=b pid(进程号) 例如:jmap -dump:format=b,file=202104012.hprof 6666
使用自动和手动dump文件的方式会把dump的文件存储到对应的服务中需要将文件下载到本地进行分析
三、copy dump文件到本地
1.登录自己的dump文件的服务器,执行 sftp xxx@jumper.xxx.cn,成功后执行命令 put 202104012.hprof(dump文件名) 传输文件。
2.文件传输完成后在本地shell 输入命令 sftp xxx@jumper.xxx.cn,命令成功后执行get 202104012.hprof(dump文件名) 拉取文件到本地。
拉取文件时需要主要执行命令的路径是存储文件的位置。
dump文件到本地以后就可以使用mat、Jprofile、visualVM等工具进行分析dump文件了。
最后:打一个小广告,后续的文章会在微信公众号“程序员之家QAQ”推送,欢迎大家搜索关注~~