jar包运行一段时间后莫名其妙挂掉线上问题及处理方案

 更新时间:2023年09月20日 15:28:59   作者:心如活水  
这篇文章主要介绍了jar包运行一段时间后莫名其妙挂掉线上问题及处理方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1、问题描述

springboot搭建的项目打包成jar包部署到Linux操作系统中,采用nohup java -jar 部署 jar 包后过一段时间(两三天)后莫名其妙挂掉(进程号PID被杀)。

2、问题定位

2.1 度娘一下

遇到这种问题,首先当然是去度娘找找看看有没有相似的人有这样的bug,看看别人的处理方法解决,结果当然是没找到合适的博客,所以就只能自己摸索摸索解决之道了。

2.2 基本操作

既然没有找到想要的,这种情况百分之九十九点九九九......的概率是内存泄露导致的。

那基本操作来一下

2.2.1 top、free -m 指令

先用top指令看下Linux系统中的进程号使用情况

从上图可看到,cpu的占用竟然干到了 100.3%以上,这么耗费cup资源,肯定就是程序有问题了。

接着用 free -m查看下内存使用情况

结果发现这个空闲内存越来越少了,还真的是内存有问题。

3、问题深入定位

上面只是初步知道程序有问题,但是还是不知道具体的问题再哪里?

就是这个问题在代码中哪里造成的还是不清楚

3.1 top -Hp PID 指令

输入PID指令将程序进程号的子线程使用系统资源的线程列举出来

从上图中可以看到733这个子线程占用了99.9%的cup使用率,这个线程肯定是有问题的,这个就要进入到JVM的栈中分析问题了,这里需要使用jstack工具进行分析问题。

3.2  jstack -l PID |grep -A 10 NID

因为在栈中的线程号是以16进制进行的,所以需要将上面733这个线程号转成16进制的数据,直接在Linux中转换: printf "%x\n"  733

然后采用jstack栈分析工具进行问题分析

jstack -l 655 |grep -A 10 0x2dd

这里的10是指打印10行的日志

找到这个子线程号,并且看到自己的报名和类,这个线程占用cpu 99.9%以上的资源就在类

ServerHandler的129行,赶紧去看看自己这个类的第129行到底写了什么东西。

这段代码直接导致了死循环,该段代码是希望读到输入流里面总的字节大小,但有时候因为网络原因无法一次读到结果,再加上while死循环,如果一直读不到,死循环就一直执行下去,故造成了死循环

4、解决

将上面导致死循环的代码注释掉改为缓存处理

5、后续

以上是一次线程问题的解决,其实一次线上问题解决没有那么快就排查出来的,如果涉及到堆问题,需要将堆问题、栈日志打印保存下来分析

堆文件生成:

jmap -dump:format=b,file=heap.hprof pid //保存了堆现场,b这里是字节的意思

(生成的堆文件采用mat分析软件定位问题)

  • 栈日志生成:jstack pid > jstack.log //线程栈的现场
  • gc执行情况:jstat -gcutil 6343 5000  //每隔5秒检查gc使用情况

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JAVA 数据结构链表操作循环链表

    JAVA 数据结构链表操作循环链表

    这篇文章主要介绍了JAVA 数据结构链表操作循环链表的相关资料,需要的朋友可以参考下
    2016-10-10
  • springboot-启动bean冲突的解决

    springboot-启动bean冲突的解决

    这篇文章主要介绍了springboot-启动bean冲突的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Spring Cloud Gateway 获取请求体(Request Body)的多种方法

    Spring Cloud Gateway 获取请求体(Request Body)的多种方法

    这篇文章主要介绍了Spring Cloud Gateway 获取请求体(Request Body)的多种方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • java TreeMap源码解析详解

    java TreeMap源码解析详解

    这篇文章主要介绍了java TreeMap源码解析详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java的HashSet源码详解

    Java的HashSet源码详解

    这篇文章主要介绍了Java的HashSet源码详解,HashSet底层封装的是HashMap,所以元素添加会放到HashMap的key中,value值使用new Object对象作为value,所以HashSet和HashMap的所具有的特点是类似的,需要的朋友可以参考下
    2023-09-09
  • Java通过接口实现匿名类的实例代码

    Java通过接口实现匿名类的实例代码

    这篇文章介绍了Java通过接口实现匿名类的实例代码,有需要的朋友可以参考一下
    2013-10-10
  • Java基础入门 Swing中间容器的使用

    Java基础入门 Swing中间容器的使用

    这篇文章主要介绍了Java基础入门 Swing中间容器的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java基础高级综合练习题扑克牌的创建

    Java基础高级综合练习题扑克牌的创建

    今天小编就为大家分享一篇关于Java基础高级综合练习题扑克牌的创建,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 轻松理解Java面试和开发中的IoC(控制反转)

    轻松理解Java面试和开发中的IoC(控制反转)

    在Java开发中,IoC意 味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。下文给大家介绍Java面试和开发中的IoC(控制反转)知识,需要的朋友参考下吧
    2017-07-07
  • IDEA 2020.1.1好用的plugins插件推荐

    IDEA 2020.1.1好用的plugins插件推荐

    这篇文章主要介绍了IDEA 2020.1.1好用的plugins插件推荐,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论