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

相信大家都遇到过,自己的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

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

以上这篇Java应用/JVM宕机排查步骤操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • JAVA实现监测tomcat是否宕机及控制重启的方法

    本文实例讲述了JAVA实现监测tomcat是否宕机及控制重启的方法.分享给大家供大家参考.具体如下: Detector.java: import java.net.URL; import java.net.URLConnection; import java.util.Date; /** * * @author james * */ public class Detector { private static void keepTomcatAlive() throws NullPointerEx

  • 解决java web应用线上系统偶发宕机的情况

    前言: 事情是酱紫的,系统上线两个月后,风平浪静.在一个秋天宁静的下午,老衲正喝着茶听着歌敲着代码,顺便欣赏下妹纸,独享这难得的惬意.突然手机响了,一看来电,心中一沉,项目经理来电,必有蹊跷.匆忙接起电话,没有问候,直奔主题,"赶紧看下系统,个别客户反馈系统不能用了,先恢复系统,再排查问题". 老衲撂下电话,一哆嗦,赶紧连上VPN,直奔服务器主机. PS:三台服务器(centos.128G内存.32核CPU),tomcat1.7,jdk1.8,通过F5负载 解决步骤: 1.top命令查

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

    相信大家都遇到过,自己的Java应用运行一段时间就宕机了或者响应请求特别慢.这时候就需要我们了来找出问题所在了.绝大部分都是代码问题导致的. 一.服务宕机 如果是服务宕机,发生致命问题导致进程已经死掉了,那么已经访问不了了,通常都是CPU问题引起的,程序一般会自己生成javacore文件,一般生成位置在/root目录或jar包同目录下.JavaCore文件主要保存的是Java应用各线程在某一时刻的运行的位置,即JVM执行到哪一个类.哪一个方法.哪一个行上. 找到这个文件,执行命令 gdb jav

  • Java服务器宕机的解决方法论

    1 宕机概要 1.1 定义 向服务器的请求都没有响应或者响应非常慢. 前端界面的崩溃并非宕机. 1.2 分类 进程闪退 内部崩溃 外部终止 线程锁死或者无限等待 内存溢出 下面分别进行详解 2 进程闪退 2.1 内部崩溃 JVM 发生内部崩溃,必然会生成"hs_err_pid"开头的文件. 下面讲一种常见情况: 无法申请内存,显示commit_memory错误 Current thread (0x00007f3e40013000): JavaThread "Unknown t

  • Java使用嵌套循环模拟ATM机取款业务操作示例

    本文实例讲述了Java使用嵌套循环模拟ATM机取款业务操作.分享给大家供大家参考,具体如下: 代码: package com.jredu.ch03; import java.util.Scanner; public class Work4 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan = new Scanner(System.in); for (int i =

  • python nohup 实现远程运行不宕机操作

    远程运行最怕断电,训练了几个小时的数据说没就没,或者停止运行. 用nohup 记录代码的输出,还可以不受断电的影响. 方法 1. 用nohup 运行一个python文件 nohup python -u main.py > nohup.out 2>&1 & 除了main.py 换成自己的文件名,nohup.out 也可以改为其他名字, nohup1.out等.其余照搬.不要问我意思,我也不太懂 2.运行后出现的结果是一行xxxx 3.想要实时看到输出结果就再写一行代码,如上图 t

  • 排查Java应用内存泄漏问题的步骤

    什么是内存泄漏 内存泄漏是指java应用的堆内存使用率持续升高,直至内存溢出. 内存泄漏的的原因可能有多种 分配给应用程序的内存本身过小.而应用的业务代码,确实需要生成大量的对象 代码bug,某些需要被回收的对象,由于代码bug,却持续的被引用,导致java虚拟机无法回收这些对象.从而撑爆内存 无论哪种内存泄露,我们的解决方法都是要定位到具体是什么对象,占用了大量内存,从而方便我们基于此进行代码分析,debug,找出代码问题. 而能够帮助我们实现这一目的的方式就是获取java应用的内存 dump

  • Java虚拟机JVM性能优化(三):垃圾收集详解

    Java平台的垃圾收集机制显著提高了开发者的效率,但是一个实现糟糕的垃圾收集器可能过多地消耗应用程序的资源.在Java虚拟机性能优化系列的第三部分,Eva Andreasson向Java初学者介绍了Java平台的内存模型和垃圾收集机制.她解释了为什么碎片化(而不是垃圾收集)是Java应用程序性能的主要问题所在,以及为什么分代垃圾收集和压缩是目前处理Java应用程序碎片化的主要办法(但不是最有新意的). 垃圾收集(GC)的目的是释放那些不再被任何活动对象引用的Java对象所占用的内存,它是Java

  • 记一次springboot服务凌晨无故宕机问题的解决

    表述 在一次服务更新后发现每天凌晨0点3秒服务准时挂,开始的时候认为是maven依赖中存在system.exit(3)类似这样的代码,但是我想了下这个代码很多客户都有用到但是只有这一个客户出现了问题,而且另外一个服务没有更新在此前几个月都是没问题的 这几天也是一样无故挂了. 环境 windows服务器 排查 1.初步怀疑是内存泄漏问题,在启动脚本中加入 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump.log,第二天起来一看

  • java虚拟机钩子关闭函数addShutdownHook的操作

    当jvm虚拟机被关闭的时候,可能我们需要做一些处理,比如对连接的关闭,或者对一些必要信息的存储等等操作,这里就可以借助于虚拟机提供的钩子函数,当jvm虚拟机关闭之前会去调用addShutdownHook注册的线程钩子. 这里做一个小实验,项目结构如下: 1.自定义的ApplicationContext的上下文 package cn.lijie; public class ApplicationContext { private static ApplicationContext applicat

随机推荐