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使用情况

总结

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

相关文章

  • idea查看properties中文变成unicode码的解决方案

    idea查看properties中文变成unicode码的解决方案

    这篇文章主要介绍了idea查看properties中文变成unicode码的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 解决SpringBoot配置文件application.yml遇到的坑

    解决SpringBoot配置文件application.yml遇到的坑

    这篇文章主要介绍了解决SpringBoot配置文件application.yml遇到的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java抽奖算法第二例

    Java抽奖算法第二例

    这篇文章主要为大家详细介绍了Java抽奖算法,根据概率将奖品划分区间,每个区间代表一个奖品,然后抽取随机数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Java快速排序的实现详细代码及通俗解释

    Java快速排序的实现详细代码及通俗解释

    这篇文章主要介绍了Java快速排序实现的相关资料,快速排序是一种高效的排序算法,通过选择一个基准值将数组分成两部分,左边的元素比基准值小,右边的元素比基准值大,然后递归地对这两部分进行排序,需要的朋友可以参考下
    2025-02-02
  • Java使用for循环解决经典的鸡兔同笼问题示例

    Java使用for循环解决经典的鸡兔同笼问题示例

    这篇文章主要介绍了Java使用for循环解决经典的鸡兔同笼问题,结合实例形式分析了Java巧妙使用流程控制语句for循环解决鸡兔同笼问题相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • Mybatis-Plus环境配置与入门案例分析

    Mybatis-Plus环境配置与入门案例分析

    MyBatis-Plus 是一个 Mybatis 增强版工具,在 MyBatis 上扩充了其他功能没有改变其基本功能,为了简化开发提交效率而存在,本篇文章带你配置环境并认识它
    2022-03-03
  • java实现文件上传和下载

    java实现文件上传和下载

    这篇文章主要为大家详细介绍了java实现文件上传和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Spring Boot 使用 logback、logstash、ELK 记录日志文件的方法

    Spring Boot 使用 logback、logstash、ELK 记录日志文件的方法

    这篇文章主要介绍了Spring Boot 使用 logback、logstash、ELK 记录日志文件的思路详解,文中给大家提到了logback 取代 log4j的理由,需要的朋友可以参考下
    2017-12-12
  • Java I/O技术之文件操作详解

    Java I/O技术之文件操作详解

    这篇文章主要介绍了Java I/O技术之文件操作详解,需要的朋友可以参考下
    2014-07-07
  • 浅析Android系统中HTTPS通信的实现

    浅析Android系统中HTTPS通信的实现

    这篇文章主要介绍了浅析Android系统中HTTPS通信的实现,实现握手的源码为Java语言编写,需要的朋友可以参考下
    2015-07-07

最新评论