openjdk platform binary 内存_记一次内存溢出导致的生产事故

本文记录了一次由于内存溢出导致的生产事故,分析过程中发现Java程序的元空间使用过多,buffer/cache占用大,JVM堆内存和垃圾回收出现问题。通过jmap、jstat等工具进行诊断,并借助Arthas和MAT工具最终定位到未正确使用缓存是问题根源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

因为同事的离职,半路被迫接手的一个可视化项目,使用ElasticSearch作为OLAP数据库、Docker作为部署工具等,突然有一天项目现场环境出现JVM内存溢出问题,被迫披挂上阵定位问题的原因

分析过程

top命令查看系统资源占有情况,cpu占用不高,内存占用高,并且虚拟内存高达16g

766584f00a28510635b690f3891aa513.png

Tips:Java 程序由于自己维护堆的使用,导致调用 glibc 去管理内存的次数较少。更糟的是 Java 8 开始使用 metaspace 原空间取代永久代,而元空间是存放在操作系统本地内存中,那线程一多,每个线程都要使用一点元空间,每个线程都分配一个arena,每个都64MB,就会导致巨大的虚拟地址被分配。

free -h 查看内存占有,buffer/cache占有很大,总内存剩余7g

d96b7c325c0537c7deafad2060423356.png

Tips:buffers是用来缓冲块设备做的,它只记录文件系统的元数据(metadata)以及 tracking in-flight pages,而cached是用来给文件做缓冲。更通俗一点说:buffers主要用来存放目录里面有什么内容,文件的属性以及权限等等。而cached直接用来记忆我们打开过的文件和程序。

通过系统日志中的java.lang.OutOfMemoryError与系统资源占用情况基本定位是jvm内存溢出造成的

ec84593bab50e51035b232faee7b274e.png

进一步使用jdk自带性能监控工具查找原因

  • jmap -heap 1 //查看堆内存情况,无此命令参数,因为该服务使用的是docker镜像的openjdk导致缺失部分jdk完整工具支持

fe2c2b25fa0bf83bcf0237baefe49992.png
  • jstat -gc 1 250 10 //查看垃圾回收gc状态情况,新生代与老年代内存基本耗尽,FullGC高达1200多次,但是未释放成功

d913cd987d80ff7fd40feee119626a18.png
  • jmap -histo:live 1 | head -n 100 //查看top前100的实例数量情况,再次受阻,报错Unable to get pid

8d8556cba1194622ab8f1ac797dd6f73.png

执行jmap命令遇到的Unable to get pid可以采用的解决方案:

  • 在docker run时加上 --init 参数
  • 安装Tini,使用tini作为入口进程,配置启动java进程

接下来,我们使用Alibaba开源的诊断工具Arthas可视化工具排查问题(PS:如果大家对Arthas不了解,可以查看官方文档)

下载arthas全量jar>拷贝到容器内>成功启动jar

docker cp 解压绝对路径 platform:/tmp/

docker exec -it  platform /bin/sh -c "cd /tmp/arthas; java -jar arthas-boot.jar"

9451174b6fe4858ffd0355af24bd344a.png

执行dashboard查看资源占有情况

ec8eddb6470b8f235bb7dda32e312558.png

通过dashboard了解到资源已基本耗尽,线程执行基本正常,最终需要通过导出dump文件分析内存分布进行分析

执行heapdump /tmp/dump.hprof导出dump文件,下载dump文件到本地,通过MAT工具进行分析

96e64f542adcdb0a475e4080fdf578cc.png

最终定位问题是因为项目中未正确使用缓存导致的

84b05244e76a0ecb5e8824afad38360a.png

参考

mac下安装MAT进行分析

Mac OS下MAT(Memory Analyzer Tool)安装与启动​blog.csdn.net
79ac826a8f36be8efdf6168006f20e67.png

openjdk-alpine容器中的jvm如何执行dump

openjdk-alpine容器中的jvm如何dump​www.crazy1984.com
本文由博客群发一文多发等运营工具平台 OpenWrite 发布
CAN长字节DM1报文是指在CAN总线上传输的长度超过8个字节的DM1报文。根据引用\[1\],当要传输的数据长度超过8个字节时,首先使用TPCM进行广播,广播内容包含即将传输报文的PGN、总的数据包长度等信息,然后使用TP.DT进行数据传输。相邻两个TP.DT之间的时间间隔是50ms到200ms。根据引用\[2\],当字节数大于8时,将会使用多帧传输参数组。根据引用\[3\],DM1报文是Diagnostic Message 1, Active Diagnostic Trouble Codes的缩写,用于点亮故障指示灯、红色停机灯等,并周期性播报控制器中处于激活状态的故障码。DM1报文的格式包括各个字节的定义,如故障指示灯、红色停机灯、琥珀色警告指示灯等。因此,CAN长字节DM1报文是指在CAN总线上传输的长度超过8个字节的DM1报文,用于传输更多的故障码信息。 #### 引用[.reference_title] - *1* [车载通信——J1939 DM1](https://blog.csdn.net/weixin_64064747/article/details/130193432)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [J1939广播DM1报文](https://blog.csdn.net/mengdeguodu_/article/details/108173263)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [J1939商用车在线诊断DM1报文](https://blog.csdn.net/traveller93/article/details/120735912)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值