Java应用/JVM宕机排查步骤操作
相信大家都遇到过,自己的Java应用运行一段时间就宕机了或者响应请求特别慢。这时候就需要我们了来找出问题所在了。绝大部分都是代码问题导致的。
一、服务宕机
如果是服务宕机,发生致命问题导致进程已经死掉了,那么已经访问不了了,通常都是CPU问题引起的,程序一般会自己生成javacore文件,一般生成位置在/root目录或jar包同目录下。JavaCore文件主要保存的是Java应用各线程在某一时刻的运行的位置,即JVM执行到哪一个类、哪一个方法、哪一个行上。
找到这个文件,执行命令
gdbjava<文件>
bt
如果文件没有损坏的话可以看到完整的栈调用信息。就可以定位到问题代码所在。
我曾经就因为底层调用的一个geo库出问题,导致程序直接挂掉,分析core文件可以清晰的看到native方法的调用。
二、服务响应请求慢
出现这个问题一般都是内存溢出,GC线程一直在重复GC,没有线程来处理用户请求,或者问题代码导致CPU占用过高。
程序崩溃前会生成HeapDump文件,也可以手动生成,HeapDump是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。
在JVM启动参数要配置好HeapDump的生成位置和配置打印gc日志。这样才能排查问题。
先分析GC日志
在线分析工具地址:https://gceasy.io/
把gc文件上传就好了,就可以看到分析结果。重点关注什么区域的GC占用最多时间。
离线分析工具:GCViewer是一款开源的GC日志分析工具。
如果程序内存溢出,通过分析gc文件可以发现程序内存占用机会100%而且一直重复GC。
分析HeapDump文件
1、先找到Java应用的pid
ps-ef|grepjava或者jps-l查看
2、查看堆内存使用量
jmap-heap
3、查看Java进程中的每一个线程的情况(linux),可以清晰的看到每一个线程的cpu及内存使用情况
top-Hp
window下可以借助工具ProcessExplorer,
4、打印线程快照信息,保存到文件xxx.txt中方便查看
jstack
>xxx.txt
参考这一篇文章:https://www.nhooo.com/article/195797.htm
5、通过top-Hp
printf"%x"
假如输出为1111
6、在xxx.txt文件中查找tid为1111的栈信息,可以看到这个线程在干什么,定位到问题代码。
7、程序宕机会自动产生dump文件,若没有宕机就手动导出dump文件
jmap-dump:format=b,file=文件名
桌面分析工具:EclipseMemoryAnalyzer,它有windows版的和Linux版的
windows下:把HeapDump文件放进去就可以了,分析完后,很直观的看到当前内存占用量最高的是某个类的某个参数。持有了多少个对象,这些对象占用了多少内存,从而定位到问题代码。
Linux下:先把EclipseMemoryAnalyzer版上传到服务器,解压,假如/home/mat为解压后路径,执行命令
/home/mat/ParseHeapDump.sh<文件名>org.eclipse.mat.api:suspectsprg.eclipse.mat.api:overview
org.eclipse.mat.api:top_components
分析完之后会在当前文件生成结果文件。下载到本地查看即可。
以上这篇Java应用/JVM宕机排查步骤操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。