Java应用/JVM宕机排查步骤操作

作者:Mistra丶 时间:2021-08-10 14:52:10 

相信大家都遇到过,自己的Java应用运行一段时间就宕机了或者响应请求特别慢。这时候就需要我们了来找出问题所在了。绝大部分都是代码问题导致的。

一、服务宕机

如果是服务宕机,发生致命问题导致进程已经死掉了,那么已经访问不了了,通常都是CPU问题引起的,程序一般会自己生成javacore文件,一般生成位置在/root目录或jar包同目录下。JavaCore文件主要保存的是Java应用各线程在某一时刻的运行的位置,即JVM执行到哪一个类、哪一个方法、哪一个行上。

找到这个文件,执行命令

gdb java <文件>

bt

如果文件没有损坏的话可以看到完整的栈调用信息。就可以定位到问题代码所在。

我曾经就因为底层调用的一个geo库出问题,导致程序直接挂掉,分析core文件可以清晰的看到native方法的调用。

二、服务响应请求慢

出现这个问题一般都是内存溢出,GC线程一直在重复GC,没有线程来处理用户请求,或者问题代码导致CPU占用过高。

程序崩溃前会生成HeapDump文件,也可以手动生成,HeapDump是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。

在JVM启动参数要配置好HeapDump的生成位置和配置打印gc日志。这样才能排查问题。

先分析GC日志

在线分析工具地址:https://gceasy.io/

Java应用/JVM宕机排查步骤操作

把gc文件上传就好了,就可以看到分析结果。重点关注什么区域的GC占用最多时间。

离线分析工具:GCViewer 是一款开源的GC日志分析工具。

如果程序内存溢出,通过分析gc文件可以发现程序内存占用机会100%而且一直重复GC。

分析HeapDump文件

1、先找到Java应用的pid

ps -ef | grep java 或者 jps -l 查看

2、查看堆内存使用量

jmap -heap <pid>

3、查看Java进程中的每一个线程的情况(linux),可以清晰的看到每一个线程的cpu及内存使用情况

top -Hp <pid>

window下可以借助工具 Process Explorer,

Java应用/JVM宕机排查步骤操作

4、打印线程快照信息,保存到文件xxx.txt中方便查看

jstack <pid> > xxx.txt

参考这一篇文章: https://www.jb51.net/article/195797.htm

5、通过top -Hp <pid>看到的线程id是10进制的,我们输出到xxx.txt中的是16进制,所以需要转一下,找一个异常线程tid

printf "%x" <tid> 假如输出为 1111

6、在xxx.txt文件中查找tid为1111的栈信息,可以看到这个线程在干什么,定位到问题代码。

7、程序宕机会自动产生dump文件,若没有宕机就手动导出dump文件

jmap -dump:format=b,file=文件名 <pid>

桌面分析工具:Eclipse Memory Analyzer,它有windows版的和Linux版的

windows下:把HeapDump文件放进去就可以了,分析完后,很直观的看到当前内存占用量最高的是某个类的某个参数。持有了多少个对象,这些对象占用了多少内存,从而定位到问题代码。

Linux下:先把Eclipse Memory Analyzer版上传到服务器,解压,假如/home/mat为解压后路径,执行命令

/home/mat/ParseHeapDump.sh <文件名> org.eclipse.mat.api:suspects prg.eclipse.mat.api:overview

org.eclipse.mat.api:top_components

分析完之后会在当前文件生成结果文件。下载到本地查看即可。

来源:https://blog.csdn.net/Axela30W/article/details/106308214

标签:Java,JVM,宕机
0
投稿

猜你喜欢

  • 基于Springboot一个注解搞定数据字典的实践方案

    2022-12-23 01:12:38
  • java 实现定时的方法及实例代码

    2023-03-31 22:48:41
  • Android天气预报app改进版

    2023-12-04 05:54:07
  • java中addMouseListener()方法的使用

    2021-07-07 19:29:35
  • C++ 继承,虚继承(内存结构)详解

    2023-09-05 21:28:01
  • Java web项目中的强制登录功能实现代码

    2023-09-14 08:26:18
  • Android使用剪切板传递数据

    2022-06-07 05:44:28
  • 分享C#中几个可用的类

    2023-08-10 10:47:17
  • Android自定义View绘图实现拖影动画

    2023-04-16 00:06:38
  • 简单实现Java web服务器

    2023-10-11 16:47:13
  • C#实现提取Word中插入的多媒体文件(视频,音频)

    2022-09-06 14:45:20
  • Android使用ContentProvider实现查看系统短信功能

    2023-12-16 23:55:46
  • Android自定义View仿IOS圆盘时间选择器

    2023-10-12 20:40:32
  • 简单总结C++中指针常量与常量指针的区别

    2022-06-28 17:33:12
  • WCF和Remoting之间的消息传输

    2023-04-15 01:01:20
  • SpringBoot实现任意位置获取HttpServletRequest对象

    2023-07-07 10:26:40
  • MyBatis中${} 和 #{} 有什么区别小结

    2021-09-21 14:42:35
  • 深入了解Hadoop如何实现序列化

    2023-10-13 10:33:43
  • Android 自定义View之边缘凹凸的优惠券效果的开发过程

    2021-12-30 07:25:10
  • 为什么阿里巴巴要求日期格式化时必须有使用y表示年

    2023-11-02 20:08:58
  • asp之家 软件编程 m.aspxhome.com