记一次java进程异常退出原因排查

news2024/10/1 3:25:20

最近在对一个Java服务进行压测,但是压测一段时间后,java进程就会自动停止,虽然怀疑可能是内存不足原因导致的,但是从服务日志中去看,并没有OOM的相关报错日志。这就很奇怪了!然后就从Java启动参数入手!

 -XX:+HeapDumpOnOutOfMemoryError=/path/to/save/dump.hprof

该参数用于在 JVM 发生 OOM 时自动生成内存 dump 文件。

 我在服务启动参数中加了如上配置后,jvm停止后并没有生成hprof文件。而且还有一个发现就是,加上这个参数之后,jvm停止能抗住压测的时间变的更短了,充分猜测该参数是会产生额外的内存占用的。

那么是不是不是OOM造成的jvm退出的锅呢?

-XX:ErrorFile=./hs_err_pid<pid>.log

当jvm出现致命错误时,会生成一个错误文件 hs_err_pid.log,其中包括了导致jvm crash的重要信息,可以通过分析该文件定位到导致crash的根源,从而改善以保证系统稳定。当出现crash时,该文件默认会生成到工作目录下

 加了上如上的参数后,本来觉得可以生成对应的文件,但是java进程退出后,以来没有任何文件生成。这个时候java进程退出的原因成了谜团。

1.应用日志没有报致命错误

2.添加jvm启动参数,监控jvm退出,没有生效

3.应用程序没有System.exit()相关操作,那究竟是什么导致了java进程的退出呢?

在这里进行补充说明一下,服务器内存8G,JVM堆内存配置:Xmx6g Xms6g。

在刚开始压测的时候,使用jvisualvm来监控jvm,其内存占用没有异常比较稳定,并且压测也采用的是固定tps进行的压测。

那么究竟什么原因导致的进程退出呢?经过不断研究。发现可以查看系统日志来找到原因。

通过查阅[ redhat 系操作系统 /var/log/messages  debian 系操作系统 /var/log/syslog ]日志,可以看到是因为操作系统内存耗尽,触发了OOM killer,杀死了服务

如图所示,在日志中搜索java关键字,果然找到了OOM的证据,同时标明了进程号和时间。

从 这里 我们也可以看到这个系统日志的各个字段的含义。

那么原因应该也比较好解释了,那就是操作系统内存不足,导致系统内核停止了java进程,导致jvm根本无法顾及生成堆文件及错误文件。

回过头来看,其实我们的OOM发生在操作系统层,和我们平时遇到的JVM的OOM是不一样的。这里需要介绍一下OOM killer:操作系统在给应用程序分配内存时,采用的是over-commit策略,即无论应用需要多少内存,操作系统都会允许,即使超过了目前剩余的容量,操作系统依然允许。这是因为操作系统觉得大部分的应用程序并不会用满他自己声明的内存。但是还是可能会出现大家都用满了自己声明的内存的情况,这个时候操作系统如果不释放内存出来,很可能连自己都无法运行了,所以这个时候操作系统就会叫OOM killer过来,给所有的进程打分,选出得分最高者,直接kill掉。一般都是内存占用最高的进程被kill掉。

并且由于JVM不会自动归还HeapSize,就算你实际使用的heap大小只有一点点,操作系统还是认为你占用了这么多的HeapSize(这也就是为什么当java进程打满jvm设置的最大堆内存后,即使服务没有任何负载,此时查看服务器内存占用还是可以发现java进程占用的内存空间略高于跟jvm设置的最大堆内存空间,然后java进程刚启动时服务器进程内存占用是小于jvm设置的最大堆内存空间的)。所以这就解释了为什么我们需要压测一段时间才会发生这个场景,那是因为由初始的HeapSize达到MaxHeapSize需要长时间的运行以积累足够的对象触发JVM的Heap扩展策略。也解释了在每次进程消失的时间点,我们实际上没有做什么消耗资源的操作,但进程还是退出了,那是因为操作系统只认你占领的内存空间,并不会管你实际使用了多少空间。

PS:由于一个java应用是单进程程序,所以当OOM killer选择了java的时候,整个java世界就会瞬间崩塌,JVM无法做任何响应就退出了,无法做任何gracefully shutdown,也不会有任何日志文件写出。

按照JVM默认的策略,MaxHeapSize默认是四分之一的内存空间,InitialHeapSize是64分之一的内存空间大小。当然可以手动配置JVM的最大堆(-Xmx)和初始堆(-Xms)的大小,具体大小值需要根据实际情况而定,设置得太大容易被OOM killer杀掉,设置地太小容易发生十分频繁的GC操作。在测试环境中,可以尽量往小配置,避免其他应用影响。加上 -XX:+HeapDumpOnOutOfMemoryError ,便于在JVM发生OOM时,可以还原“事故现场” (需要注意的是:OOM dump 本身也需要利用堆外内存,当堆外内存达到上限时,触发系统的 oomkiller 机制把java进程杀死,这带来一个小问题:如果要保证 JVM OOM 自动 dump 机制能顺利执行,我们就需要在操作系统里预留出足够的堆外内存,这就带来内存利用率的问题了。如果 JVM 直接运行在宿主操作系统,没有容器的限制,能申请的堆外内存是受限于系统能分配的内存的,不同应用的 JVM 可共享这个可分配内存空间。)。

当然这次导致jvm进程退出的原因是操作系统内核导致的,那有没有可能是代码问题呢?其中一个重要的点就是内存泄漏。

内存泄露和内存溢出是两个不同的概念。内存泄露关心的是无用对象,内存泄漏最终会导致内存溢出。除了内存泄露,在瞬时读取大量数据至内存中也是会导致内存溢出的,比如数据库返回大量的对象,或者读取了一张很大的图片在内存中。

经典的、常见的内存泄漏的原因有以下几个方面:

静态的集合类:由于这些变量的生命周期与应用程序保持一致,所以会导致这些类中的对象就算被手动置为null,也无法被释放。

单例:同1,单例类的生命周期与应用程序也保持一致,如果单例类中也保持了某些对象,那么这些对象也是无法被回收的。

各种连接、IO:这些操作都是十分消耗资源的,如果忘记了关闭,比如忘记关闭数据库连接,那么也是会发生内存泄漏的情况。

threadlocal:由于threadlocal变量的生命周期与线程保持一致,当与线程池结合使用时,由于线程使用完毕后不会销毁,所以threadlocal变量可能也会出现泄漏的情况。

其他:比如监听器,外部模块调用等。。

大体上所有的内存泄露的原因都可以通过研究Heap Dump文件(堆转储)来解决。JVM可以通过jmap命令dump出当前的heap快照,通常后缀名为.hprof。JVM支持在OOM时,dump出当前的heap,便于开发人员分析为何出现了OOM。

参考文档:某Java服务异常退出原因排查过程分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1913133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MQTT教程--服务器使用EMQX和客户端使用MQTTX

什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议&#xff0c;适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎&#xff0c;能够实现传感器、执行器和其它设备…

WPF依赖附加属性

依赖附加属性的定义 基本过程&#xff1a;声明、注册、包装 依赖附加属性必须在依赖对象&#xff0c;附加属性不一定&#xff0c;关注的是被附加的对象是否是依赖对象 快捷方式&#xff1a;propa tab 关键字&#xff1a;RegisterAttached // 方法封装 public static int …

【系统架构设计师】九、软件工程(需求工程|系统分析与设计|DFD|DD|高内聚低耦合)

目录 四、需求工程 4.1 软件需求层次 4.2 软件需求 4.3 需求获取 4.4 需求分析 4.5 需求定义 4.6 需求确认与验证 4.7 需求管理 4.7.1 变跟控制 4.7.2 需求追踪 五、系统分析与设计 5.1 结构化方法 5.1.1 结构化需求分析 5.1.2 数据流图DFD 5.1.3 数据字典DD …

外卖商城平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;骑手管理&#xff0c;商品类型管理&#xff0c;商品信息管理&#xff0c;订单信息管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&#…

完美解决ImportError: cannot import name ‘idnadata‘的正确解决方法,亲测有效!!!

完美解决ImportError: cannot import name idnadata’的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 完美解决ImportError: cannot import name idnadata的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01;报错问题…

灭世男孩

《血腥复仇与反乌托邦之旅&#xff1a;<灭世男孩>的暴力美学盛宴》 在众多电影的海洋中&#xff0c;有一部独特而引人注目的作品——《灭世男孩》。这部由德国、南非和美国联合制作的电影&#xff0c;以其独特的风格、精彩的动作场面和深刻的主题&#xff0c;为观众带来了…

Studio One直播声音怎么调 Studio One直播没有声音输出怎么办 studio one如何设置声音变好听

Studio One做为新生代音乐工作站&#xff0c;凭借更低的价格和完备的功能&#xff0c;获得了音乐人和直播行业工作者的青睐&#xff0c;尤其是对硬件声卡的适配支持更好&#xff0c;特别适合用来配合线上教学和电商带货。 一、Studio One直播声音怎么调 在Studio One进行直播时…

odoo17 常见升级问题

通用问题 模型名变更 字段变更 方法名变更 方法参数变更 xml数据结构定义变化 xml的id变更 view视图变化&#xff0c;导致xpath路径出差 template结构变化&#xff0c;&#xff0c;导致xpath路径出差&#xff0c;或者id不存在 升16问题 前端owl的架构变化 升17问题 前端 标…

OJhelper一款帮助你获取各大oj信息的软件

项目地址 应用功能 目前应用支持&#xff1a;查询、自定义、收藏各大oj比赛信息&#xff0c;跳转比赛界面。查询各大oj的Rating分以及题量&#xff0c;查看题量饼状图。 应用环境 windows和安卓端 应用预览&#xff1a; 维护概况 后期会提供持续更新&#xff0c;具体可以…

回溯算法-以医院信息管理系统为例

1.回溯算法介绍 1.来源 回溯算法也叫试探法&#xff0c;它是一种系统地搜索问题的解的方法。 用回溯算法解决问题的一般步骤&#xff1a; 1、 针对所给问题&#xff0c;定义问题的解空间&#xff0c;它至少包含问题的一个&#xff08;最优&#xff09;解。 2 、确定易于搜…

压缩感知3——重构算法正交匹配追踪算法

算法流程 问题的实质是&#xff1a;AX Y 求解&#xff08;A是M维&#xff0c;Y是N维且N>>M并且稀疏度K<M&#xff09;明显X有无穷多解&#xff0c;重构过程是M次采样得到的采样值升维的过程。OMP算法的具体步骤&#xff1a;(1)用X表示信号&#xff0c;初始化残差e0 …

人工智能算法工程师(中级)课程2-Opencv视觉处理之高级操作

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程2-Opencv视觉处理之高级操作。在上一节课中的OpenCV基础操作我们了解到OpenCV是一个开源的计算机视觉软件库。它提供了各种视觉处理函数&#xff0c;并支持多种编程语言&#xff0c;如…

鸿蒙语言基础类库:【@ohos.util (util工具函数)】

util工具函数 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 该模块…

鸟类领域超大规模检测实践,基于YOLOv8轻量级检测模型开发构建超大规模生活场景下500种鸟类检测识别分析系统

关于鸟类的检测、识别相关的开发实践在前面的系列博文中也有不少的实践记录&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 【检测类】 《AI识鸟&#xff0c;基于YOLOv5【n/s/m/l/x】全系列参数模型开发构建工业野外场景下鸟类检测识别分析系统》 《基于轻量级YOL…

2018-2022 年份微博签到数据集

前阵子接到一个实验室老师的需求&#xff0c;采集五年前&#xff08;2024-52019&#xff09;过年前后的北京微博签到数据。 前两年采集的深圳签到数据是 2022 年是当年的尚可&#xff0c;这次虽然时间跨度只有两个月&#xff0c;但是由于时间太过久远&#xff0c;但是颇费了一…

快速入门,springboot知识点汇总

学习 springboot 应该像学习一门编程语言一样&#xff0c;首先要熟练掌握常用的知识&#xff0c;而对于不常用的内容可以简单了解一下。先对整个框架和语言有一个大致的轮廓&#xff0c;然后再逐步补充细节。 前序: Spring Boot 通过简化配置和提供开箱即用的特性&#xff0c…

「C++系列」C++ 修饰符类型

文章目录 一、C 修饰符类型1. 访问修饰符&#xff08;Access Modifiers&#xff09;2. 存储类修饰符&#xff08;Storage Class Specifiers&#xff09;3. 类型修饰符&#xff08;Type Modifiers&#xff09;4. 函数修饰符 二、C 修饰符类型-案例1. 访问修饰符案例2. 存储类修饰…

以终为始,胜意费控云「包干管控」助力精细管控与体验提升

在全球宏观经济环境的波动和内在经济逻辑的推动下&#xff0c;我国经济正经历着关键的结构调整期。如何稳健穿越周期&#xff0c;是企业必须直面的课题。与此同时&#xff0c;企业成本管控也面临着更为精细和严格的挑战。 企业需要一种更为灵活合理的费用管控策略。胜意费控云升…

【人工智能】-- 搜索技术(状态空间法)

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a; 专业知识 文章目录 &#x1f349;引言 &#x1f348;介绍 &#x1f349;状态空间法 &#x1f348;状态空间的构成 &#x1f34d;状态 &#x1f34d;算符…

Pyecharts绘制热力图的说明+代码实战

引言 热力图在数据可视化中是一种强大的工具&#xff0c;可以直观地展示数据的分布情况和变化趋势。Pyecharts是一个基于Echarts的Python可视化库&#xff0c;提供了丰富的图表类型&#xff0c;包括热力图。在本文中&#xff0c;我们将深入探讨Pyecharts绘制多种炫酷热力图的参…