解决JVM进程被系统杀掉问题

news2024/10/5 21:23:46

背景

服务A在测试环境,隔几个小时接口就无法访问。登录机器查看,发现进程已经没了。大致猜想是进程使用的内存或CPU资源使用太多,导致被系统kill。

问题定位

使用dmesg命令查看进程被kill的详情。

> dmesg --time-format iso
2024-03-05T02:45:48,770989+0000 pool-2-thread-6 invoked oom-killer: gfp_mask=0x100cca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0
2024-03-05T02:45:48,779128+0000 CPU: 0 PID: 838 Comm: pool-2-thread-6 Not tainted 5.10.184-175.749.amzn2.x86_64 #1
2024-03-05T02:45:48,911347+0000 Mem-Info:
2024-03-05T02:45:48,914582+0000 active_anon:83 inactive_anon:455069 isolated_anon:0
                                 active_file:71 inactive_file:1104 isolated_file:32
                                 unevictable:0 dirty:0 writeback:0
                                 slab_reclaimable:4982 slab_unreclaimable:6781
                                 mapped:555 shmem:118 pagetables:2540 bounce:0
                                 free:13097 free_pcp:394 free_cma:0
2024-03-05T02:45:48,939533+0000 Node 0 active_anon:332kB inactive_anon:1820276kB active_file:1748kB inactive_file:1908kB unevictable:0kB isolated(anon):0kB isolated(file):0kB mapped:2220kB dirty:0kB writeback:0kB shmem:472kB shmem_thp: 0kB shmem_pmdmapped: 0kB anon_thp: 0kB writeback_tmp:0kB kernel_stack:8048kB all_unreclaimable? no
2024-03-05T02:45:48,958593+0000 Node 0 DMA free:7924kB min:364kB low:452kB high:540kB reserved_highatomic:0KB active_anon:0kB inactive_anon:7688kB active_file:0kB inactive_file:0kB unevictable:0kB writepending:0kB present:15992kB managed:15908kB mlocked:0kB pagetables:16kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB
2024-03-05T02:45:48,977738+0000 lowmem_reserve[]: 0 1891 1891 1891
2024-03-05T02:45:48,981797+0000 Node 0 DMA32 free:44716kB min:44688kB low:55860kB high:67032kB reserved_highatomic:0KB active_anon:332kB inactive_anon:1812588kB active_file:1748kB inactive_file:1840kB unevictable:0kB writepending:0kB present:2041768kB managed:1954608kB mlocked:0kB pagetables:10144kB bounce:0kB free_pcp:2084kB local_pcp:1164kB free_cma:0kB
2024-03-05T02:45:49,003571+0000 lowmem_reserve[]: 0 0 0 0
2024-03-05T02:45:49,007346+0000 Node 0 DMA: 1*4kB (U) 2*8kB (UM) 4*16kB (UME) 5*32kB (UME) 4*64kB (UME) 4*128kB (UME) 3*256kB (UME) 2*512kB (UE) 3*1024kB (UE) 1*2048kB (U) 0*4096kB = 7924kB
2024-03-05T02:45:49,020018+0000 Node 0 DMA32: 223*4kB (UME) 118*8kB (UE) 180*16kB (UME) 300*32kB (UME) 189*64kB (UME) 31*128kB (UM) 4*256kB (UM) 0*512kB 1*1024kB (M) 4*2048kB (M) 1*4096kB (M) = 44716kB
2024-03-05T02:45:49,032871+0000 Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=1048576kB
2024-03-05T02:45:49,040653+0000 Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
2024-03-05T02:45:49,047994+0000 1180 total pagecache pages
2024-03-05T02:45:49,051655+0000 0 pages in swap cache
2024-03-05T02:45:49,055150+0000 Swap cache stats: add 0, delete 0, find 0/0
2024-03-05T02:45:49,059720+0000 Free swap  = 0kB
2024-03-05T02:45:49,062834+0000 Total swap = 0kB
2024-03-05T02:45:49,065939+0000 514440 pages RAM
2024-03-05T02:45:49,069266+0000 0 pages HighMem/MovableOnly
2024-03-05T02:45:49,072870+0000 21811 pages reserved
2024-03-05T02:45:49,076104+0000 0 pages hwpoisoned
2024-03-05T02:45:49,079323+0000 Tasks state (memory values in pages):
2024-03-05T02:45:49,083269+0000 [  pid  ]   uid  tgid total_vm      rss pgtables_bytes swapents oom_score_adj name
2024-03-05T02:45:49,322324+0000 [   2396]     0  2396     6972       52   102400        0             0 atd
2024-03-05T02:45:49,329382+0000 [   2401]     0  2401     6171      158    94208        0             0 crond
2024-03-05T02:45:49,336441+0000 [   2421]     0  2421     2640       31    69632        0             0 agetty
2024-03-05T02:45:49,343630+0000 [   2423]     0  2423    30328       32    73728        0             0 agetty
2024-03-05T02:45:49,350830+0000 [   2471]     0  2471   180962     1854   147456        0             0 ssm-agent-worke
2024-03-05T02:45:49,358399+0000 [   2518]     0  2518     1068       27    57344        0             0 acpid
2024-03-05T02:45:49,374968+0000 [   4629]  1000  4629  1828472   445489  5488640        0             0 java
2024-03-05T02:45:49,404273+0000 [   4196]  1001  4196    31300      340    86016        0             0 bash
2024-03-05T02:45:49,413123+0000 [   8991]    89  8991    22598      254   204800        0             0 pickup
2024-03-05T02:45:49,439185+0000 oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/,task=java,pid=4629,uid=1000
2024-03-05T02:45:49,454767+0000 Out of memory: Killed process 4629 (java) total-vm:7313888kB, anon-rss:1781956kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:5360kB oom_score_adj:0

在日志最后看到jvm进程被kill,原因是使用了7G的虚拟内存和1.7G的真实内存。而机器的内存是514440 pages * 4K ≈ 2G。

为什么JVM会使用1.7G内存?

JVM配置是-Xmx1500m -XX:MaxMetaspaceSize=256M,所以加起来用了1.7G,导致系统内存不足。处理的方案是:

第一步,先将-Xmx1500m改成-Xmx1024m,避免进程被jvm杀死。

然后,系统能占用这么多内存,一定是发生了内存泄露。在系统OOM时,尝试把堆内存dump出来,在JVM启动命令加上 -XX:HeapDumpPath=/tmp/java_heapdump.hprof 参数。

分析堆内存

得到堆文件后,通过MAT(Memory Analyzer Tool)进行分析内存使用情况。下载地址是:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation

注意事项
文档里写了“The minimum Java version required to run the stand-alone version of Memory Analyzer is Java 17. See JRE/JDK Sources.”,也就是运行的最低JDK版本是17.

需要下载JDK17后,在MemoryAnalyzer.ini配置文件里加上JDK的路径,如下所示:
-vm
E:\\jdks\\jdk-17\\bin

另外,内存解析比较耗内存,最好给MAT分配更多的内存,在配置里设置:-Xmx4096m

MAT提供了内存泄露的分析能力,在Overview→Reports→Leak Suspects就能看到分析报告。

Leak Suspects

报告里给出了3个可能的泄露点,以及对象各自占用的内存大小:

可以看到,a+b+c占用已经将近900M,我们再展开看看是什么对象占用了内存。

描述里说了一个com.microsoft.cognitiveservices.speech.SpeechSynthesizer就占用了400M内存,大部分内存都是放在Object[]数组里。

接下来我们要找到占用最大内存的SpeechSynthesizer对象,看里面那个属性造成内存泄露。

Dominator Tree

Dominator Tree能列出大对象和它们内部的对象路径。

从图中就能看到,第一个SpeechSynthesizer对象占用了400M,并且是VisemeReceived属性里的eventHandlerClients数组,包含了823个对象。数组里的元素是Text2SpeechMicrosoft类里的一个lambda对象,每个对象占用约1M。

至此,问题就很好定位了,找到eventHandlerClients数组追加元素的地方,看是否有异常。

问题的原因

泄露的地方是,我们用到了微软的文本转语音功能,要拿到Viseme信息,这个信息要通过回调接口获得,所以需要注册一个回调函数。

speechSynthesizer.VisemeReceived.addEventListener(visemeEventHandler);

原来speechSynthesizer对象每次都会创建,由于创建比较耗时,改用了预创建一批放入线程池的方式。这就导致speechSynthesizer对象会被复用,那么调用addEventListener(visemeEventHandler),而不删掉的话,就会越来越多。解决的方案是加上removeEventListener(visemeEventHandler)方法。

总结

遇到问题的时候,通过dmesg命令确定进程是被系统kill。然后,用 -XX:HeapDumpPath命令拿到堆信息。最后,通过MAT工具分析内存泄露的地方。

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

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

相关文章

【Python如何与电脑玩石头剪刀布游戏】

1、石头剪刀布Python代码如下: import random while True:a random.randint(0, 2)b int(input("请输入一个数字(0石头, 1剪刀, 2布): "))c [石头, 剪刀, 布]if b ! 0 and b ! 1 and b ! 2:print("傻子,你出错了…

五子棋小游戏(sut实验报告)

实验目的 实现人与人或人与电脑进行五子棋对弈 实验内容 启动游戏,显示游戏参数设置界面,用户输入参数后进入游戏界面,显示棋盘及双方博弈过程,游戏过程中可选择退出游戏。判定一方获胜后结束本局游戏,可选择继续下…

S4 Hana SD -信贷管理 - 02

2.3 给信贷控制范围分配公司代码 TCODE: SPRO 配置路径:IMG > 企业结构 > 分配 > 财务会计 > 给信贷控制区分配公司代码 配置路径截图: 公司:被分配的公司代码。 公司名称&城市:已在公司代码数据中维护。 CCAR:分配的信贷控制范围。 覆盖CC范围:如…

InstantID Zero-shot Identity-Preserving Generation in Seconds

InstantID: Zero-shot Identity-Preserving Generation in Seconds TL; DR:InstantID IP-Adapter (Face) ControlNet,实现了具有较高保真度的人脸 ID 生成。 方法 InstantID 想做到的事情是:给定一张参考人脸 ID 图片,生成该…

专升本 C语言笔记-07 逗号运算符

1.逗号表达式的用法 就是用逗号隔开的多个表达式。逗号表达式,从左向右依次执行。 2.逗号表达式的特性 2.1.当没有括号时,第一个表达式为整个表达式的值。 代码 int x 3,y 5,a 0; a x,y; printf("a %d",a); 说明:因为逗号优先级最低,会…

利用Python进行网络爬虫:Beautiful Soup和Requests的应用【第131篇—Beautiful Soup】

利用Python进行网络爬虫:Beautiful Soup和Requests的应用 在网络数据变得日益丰富和重要的今天,网络爬虫成为了获取和分析数据的重要工具之一。Python作为一种强大而灵活的编程语言,在网络爬虫领域也拥有广泛的应用。本文将介绍如何使用Pyth…

【智能硬件、大模型、LLM 智能音箱】MBO:基于树莓派、ChatGPT 的桌面机器人

MAKER:David Packman/译:趣无尽(转载请注明出处) 这是国外 Maker David Packman 制作的基于树莓派机器人 MBO,该机器人的外观设计灵感来自动漫 Adventure Time 中的机器人 MBO。它具有强大的交互功能,可实现脱机唤醒词检测、调用 ChatGPT 3.5 进行聊天、机器视觉对图像进…

解决Git:Author identity unknown Please tell me who you are.

报错信息: 意思: 作者身份未知 ***请告诉我你是谁。 解决办法: git config --global user.name "你的名字"git config --global user.email "你的邮箱"

Android 15 首个开发者预览版到来

作者 / 工程副总裁 Dave Burke Android 15 的首个开发者预览版现已发布,以便各位开发者能与我们通力协作,打造更优秀的 Android 平台。 在 Android 15 中,我们继续致力于打造一个既能提升工作效率,又能提供全新功能的平台。这些新…

蓝桥杯-模拟-4402. 刷题统计

题目 思路 代码 a,b,nmap(int,input().split()) sa*5b*2 resn//s*7 # 存在周期 d[a,a,a,a,a,b,b] n%s i0 while n>0: # 对剩余数量进行枚举,如果等于0,相当于还会再进去加一天n-d[i]i1res1 print(res)

es 聚合操作(一)

前言 Elasticsearch除搜索以外,提供了针对ES 数据进行统计分析的功能。聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 衣服品牌的受欢迎程度这些衣服的平均价格、最高价格、最低价格这些衣服的每天、每月销量如何 使用…

cpp qt 一个奇怪的bug

今天在用cpp qt的时候发现了一个奇怪的东西 这是我的源代码 #include "mywidget.h" #include <QPushButton>myWidget::myWidget(QWidget *parent): QWidget(parent) {QPushButton * btn1 new QPushButton;btn1->show();btn1->setParent(this);btn1-&g…

在集群模式下,Redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?

目录 一、分布式寻址算法 1. hash 算法 2. 一致性 hash 算法 3. Redis cluster 的 hash slot 算法 二、Redis cluster 的高可用与主备切换原理 1. 判断节点宕机 2. 从节点过滤 3. 从节点选举 4. 与哨兵比较 一、分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash…

【代码随想录 | 链表 02】反转链表

文章目录 2.反转链表2.1题目2.2解法2.2.1双指针法2.2.2递归法 2.反转链表 2.1题目 206.反转链表——力扣链接 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例一&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;…

重建大师出现图中密集匹配失败的情况,是什么原因导致的?

可以检查瓦块是否位于测区边缘&#xff0c;边缘瓦块可以忽略&#xff1b;如果是中间区域的话&#xff0c;可能中间文件有异常&#xff0c;可以新建个reconstruction&#xff0c;然后单独提交失败的瓦块。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&…

数据结构:7、队列

一、队列的概念与结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队头…

Cisco Packet Tracer模拟器实现路由器的路由配置及网络的安全配置

1. 内容 1. 配置路由器实现多个不同网络间的通信&#xff0c;路由器提供的路由协议包括静态路由协议、RIP动态路由、OSPF动态路由协议等等&#xff0c;训练内容包括路由器的静态路由配置、路由器的RIP动态路由配置、路由器的OSPF动态路由配置以及路由器的路由重分布配置。 2.…

Css基础——溢出文字省略号表达

1. 单行文本溢出显示省略号&#xff1a; 1.1、方法&#xff1a; 1. 先强制一行内显示文本*/ white-space: nowrap; &#xff08; 默认 normal 自动换行&#xff09; 2. 超出的部分隐藏*/ overflow: hidden; 3. 文字用省略号替代超出的部分*/ text-overflow: ellipsis; 1.2、代…

实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)

导 读 本文主要介绍使用YOLOv9和OpenCV实现车辆跟踪计数&#xff08;步骤 源码&#xff09;。 实现步骤 监控摄像头可以有效地用于各种场景下的车辆计数和交通流量统计。先进的计算机视觉技术&#xff08;例如对象检测和跟踪&#xff09;可应用于监控录像&#xff0c;…

单调队列 维护区间最值(板子+两道练手)

1.P1886 滑动窗口 /【模板】单调队列https://www.luogu.com.cn/problem/P1886 板子题&#xff0c;传送门在上方 // Problem: // P1886 滑动窗口 /【模板】单调队列 // // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P1886 // Memory Limit: 500 MB //…