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/
把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,
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


猜你喜欢
- @NonNull导致无法序列化的问题以上这个代码在接参的时候报了一个缺少无参构造函数无法序列化的错误将.class反编译可以看到编译后的源码
- Android中Property模块的键值设置Prop模块是保存少量的全局共享信息,其保存的数据具有信息量少,跨进程共享数据等特性;每一条信
- 1.1 JDK 14详细概述JDK 8 已经在 2014年 3月 18日正式可用,JDK 8作为长期支持(Long-Term-Support
- 原理解析在开发当中,“断点续传”这种功能很实用和常见,听上去也是比较有“逼格”的感觉。所以通常我们都有兴趣去研究研究这种功能是如何实现的?
- Collection继承、实现关系如下(说明(I)表示接口, (C)表示Java类,<--表示继承,<<——表示实现):(
- 一、简介 TextureMapFragment:用于显示地图片段。 二、示例3--Demo03MapFragment.c
- 本文实例为大家分享了自定义渐变式炫酷动画的ListView下拉刷新,供大家参考,具体内容如下主要要点listview刷新过程中主要有三个步骤
- 在C#程序开发过程中,很多时候可能需要将字符串根据特定的分割字符分割成字符或者List集合,例如根据逗号将字符串分割为数组,或者根据竖线将字
- Maven热部署,顾名思义就是可以不影响项目在服务器中的运行情况,可以实现项目代码的更新,减少启动,编译时间,达到快速开发的目的,也不需要手
- 前言Java多线程实现方式主要有四种:① 继承Thread类、实现Runnable接口② 实现Callable接口通过FutureTask包
- 理解枚举类型枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了
- 一、内容实操实现APP门户界面框架设计,至少包含4个tab页,能实现tab页之间的点击切换二、技术使用布局(layouts)和分段(frag
- 一、应用场景之前做商城应用时,会有对用户资料的设置情况进行限制,如下:(1)用户邮箱,应当只允许输入英文字母,数字和@.两个符号,(2)用户
- 前言实现轨迹回放,GMap.NET有对应的类GMapRoute。这个类函数很少,功能有限,只能实现简单的轨迹回放。要实现更复杂的轨迹回放,就
- Android PopWindow 设置背景亮度的实例设置背景 /** * 设置添加屏幕的背景透明度 * @param bgAl
- 本文分享了如何对Dubbo服务进行优雅的参数校验,以实现服务端统一的数据返回格式,同时也在一定程度提升开发效率,避免重复简单的参数校验逻辑.
- 几乎所有运算符都只能操作“主类型”(Primitives)。例外是“=”、“= =”和“! =”,它们能操作所有对象。除此以外,String
- 突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失。效果图如下
- 将一个项目导入最烦的是遇到各种报错,前段时间搞的一个项目,各个功能模块单独作为一个工程,然后不同工程之间相互调用,这里会报这么一个·错误a
- 相信对于一名JAVA开发者开说properties文件一定再熟悉不过了,比如一下配置:config.properties会经常存放一些系统常