线上OOM问题排查总结

自己搭建了一个小博客,该文章与博客文章同步。

一般情况下,出现OOM主要有一下三种原因。
  1. 一次性申请对象的太多。更改申请对象数量。
  2. 内存资源耗尽未释放。找到未释放的对象进行释放。
  3. 本身资源不够。jmap -heap 查看堆信息。

分几种情况解决:

系统已经挂了的情况:

-XX:+HeapDumpOnOutOfMemoryError
这个jvm启动参数含义:当堆内存空间溢出时输出堆的内存快照。
配合参数:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/home/tomcat/logs/…
触发条件:java.lang.OutOfMemoryError: Java heap space,也就是说当发生OutOfMemoryError错误时,才能触发-XX:HeapDumpOnOutOfMemoryError 输出到-XX:HeapDumpPath指定位置。
关于fullgc:Systerm.gc() 以及fullgc 不会触发-XX:HeapDumpOnOutOfMemoryError

系统运行中还未OOM

导出dump文件:jmap -dump:format=b,file=java_pidxxxx.hprof 14660
Arthas
结合jvisualvm 进行调试
查看最多跟业务有关对象->找到GCRoot ->查看线程栈

我们以一个场景为例:

准备三个java文件:
OOMUser

package com.aquarius.wizard.jdkapi.oom;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author zhaoyijie* @since 2024/6/22 09:17*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OOMUser {private Integer id;private String name;}

OOMService

package com.aquarius.wizard.jdkapi.oom;import java.util.ArrayList;
import java.util.List;
import java.util.UUID;/*** @author zhaoyijie* @since 2024/6/22 09:19*/
public class OOMService {public void getUserList() {List<OOMUser> list = new ArrayList<OOMUser>();int i = 0;while (true) {list.add(new OOMUser(i++, UUID.randomUUID().toString()));}}
}

OOMDemo

package com.aquarius.wizard.jdkapi.oom;/*** @author zhaoyijie* @since 2024/6/22 08:49*/
public class OOMDemo {public static void main(String[] args) {//java -Xms10M -Xmx10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/zhaoyijie/IdeaProjects/java-study/Jdk-api-demo/logs/ -cp Jdk-api-demo-1.0.jar com.aquarius.wizard.jdkapi.oom.OOMDemoOOMService oomService = new OOMService();oomService.getUserList();}
}
zhaoyijie@zhaoyijiedeMacBook-Pro target % java -Xms10M -Xmx10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/zhaoyijie/IdeaProjects/java-study/Jdk-api-demo/logs/ -cp Jdk-api-demo-1.0.jar com.aquarius.wizard.jdkapi.oom.OOMDemo
java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to /Users/zhaoyijie/IdeaProjects/java-study/Jdk-api-demo/logs/java_pid71318.hprof ...
Heap dump file created [11439235 bytes in 0.059 secs]
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceededat java.util.UUID.randomUUID(UUID.java:144)at com.aquarius.wizard.jdkapi.oom.OOMService.getUserList(OOMService.java:17)at com.aquarius.wizard.jdkapi.oom.OOMDemo.main(OOMDemo.java:12)
zhaoyijie@zhaoyijiedeMacBook-Pro target % cd ..
zhaoyijie@zhaoyijiedeMacBook-Pro Jdk-api-demo % tree
.
├── logs
│   └── java_pid71318.hprof
├── pom.xmlzhaoyijie@zhaoyijiedeMacBook-Pro target % jvisualvm

导出路径是/Users/zhaoyijie/IdeaProjects/java-study/Jdk-api-demo/logs/
你必须确保有这个路径,否则导出不成功,程序不会自动创建文件夹
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
找到最占内存的实例,双击实例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里表示是OOMDemo的第12行,也就是oomService.getUserList();这个方法导致了OOM,这个方法写的是个死循环。

其他工具:
1.jmap -heap 查看是否内存分配过小
2.jmap -histo 查看是否有明显的对象分配过多且没有释放情况
3.jmap -dump 导出 JVM 当前内存快照,使用 JDK 自带或 MAT 等工具分析快照

jmap -histo:live 71854 | head -10

zhaoyijie@zhaoyijiedeMacBook-Pro ~ % jps
71131 RemoteMavenServer36
70218 Main
71855 Jps
71854 OOMDemo
zhaoyijie@zhaoyijiedeMacBook-Pro ~ % jmap -histo:live 71854  | head -10num     #instances         #bytes  class name
----------------------------------------------1:         51019        4488144  [C2:         50999        1223976  java.lang.String3:         49520        1188480  com.aquarius.wizard.jdkapi.oom.OOMUser4:         49648         794368  java.lang.Integer5:           571         313888  [Ljava.lang.Object;6:           557          63992  java.lang.Class7:           439          29280  [I

jstat -gcutil 75841 1000 10

   zhaoyijie@zhaoyijiedeMacBook-Pro ~ % jps
75841 OOMDemo
75588 Main
75844 Jps
73694 jar
zhaoyijie@zhaoyijiedeMacBook-Pro ~ % jstat -gcutil 75841 1000 10
S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
33.71   0.00   0.00  92.95  70.58  74.10     22    7.029     5    9.073   16.102
33.71   0.00   0.00  92.95  70.58  74.10     22    7.029     5    9.073   16.102
0.00   0.00   6.00  70.55  70.58  74.10     22    7.029     5   14.942   21.971
0.00   0.00 100.00  70.55  70.58  74.10     23    7.029     5   14.942   21.971
16.87  16.86 100.00  72.39  70.58  74.10     24    7.471     5   14.942   22.413
16.87  16.87 100.00  76.21  70.58  74.10     25    8.006     5   14.942   22.948
16.87  16.87 100.00  79.29  70.58  74.10     26    8.728     5   14.942   23.670
17.83   0.00  38.00  88.79  70.58  74.10     28    9.677     5   14.942   24.620
0.00  18.82   0.00  91.90  70.58  74.10     29   10.345     6   14.942   25.287
0.00  18.82   0.00  91.90  70.58  74.10     29   10.345     6   14.942   25.287
zhaoyijie@zhaoyijiedeMacBook-Pro ~ % jstack 75841

可以看到老年代的内存达到了百分之90以上,有跌倒百分之70,但是后面又回升到了百分之90。fullGC执行了6次,老年代存在大量不回收的对象。
jstack不方便查看,推荐Arthas
https://arthas.aliyun.com/

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

未使用的时候需要停止

zhaoyijie@zhaoyijiedeMacBook-Pro software % java -jar arthas-boot.jar[INFO] JAVA_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre
[INFO] arthas-boot version: 3.7.2
[INFO] Process 75588 already using port 3658
[INFO] Process 75588 already using port 8563
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 75588 com.intellij.idea.Main[2]: 77952 wechatImageMonitor.jar
1
[INFO] arthas home: /Users/zhaoyijie/.arthas/lib/3.7.2/arthas
[INFO] The target process already listen port 3658, skip attach.
[INFO] arthas-client connect 127.0.0.1 3658,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---./  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'wiki       https://arthas.aliyun.com/doc
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html
version    3.7.2
main_class
pid        75588
time       2024-06-23 09:08:36[arthas@75588]$ stop
Resetting all enhanced classes ...
Affect(class count: 0 , method count: 0) cost in 1 ms, listenerId: 0
Arthas Server is going to shutdown...
[arthas@75588]$ session (5948c830-32cc-43d5-a878-fd9bbca42a87) is closed because server is going to shutdown.
zhaoyijie@zhaoyijiedeMacBook-Pro software %

否则会抛出异常

zhaoyijie@zhaoyijiedeMacBook-Pro software % java -jar arthas-boot.jar[INFO] JAVA_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre
[INFO] arthas-boot version: 3.7.2
[INFO] Process 75588 already using port 3658
[INFO] Process 75588 already using port 8563
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 75588 com.intellij.idea.Main[2]: 73694 wechatImageMonitor.jar
2
[ERROR] The telnet port 3658 is used by process 75588 instead of target process 73694, you will connect to an unexpected process.
[ERROR] 1. Try to restart arthas-boot, select process 75588, shutdown it first with running the 'stop' command.
[ERROR] 2. Or try to stop the existing arthas instance: java -jar arthas-client.jar 127.0.0.1 3658 -c "stop"
[ERROR] 3. Or try to use different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1

使用dashboard命令

[arthas@77952]$ dashboard
Memory                                               used             total             max              usage             GC
heap                                                 153M             219M              3641M            4.21%             gc.ps_scavenge.count                                         246
ps_eden_space                                        79M              79M               1329M            5.97%             gc.ps_scavenge.time(ms)                                      1396
ps_survivor_space                                    12M              17M               17M              73.02%            gc.ps_marksweep.count                                        14
ps_old_gen                                           61M              122M              2731M            2.25%             gc.ps_marksweep.time(ms)                                     202
nonheap                                              28M              29M               -1               94.94%
code_cache                                           5M               5M                240M             2.21%
metaspace                                            20M              21M               -1               96.66%
compressed_class_space                               2M               2M                1024M            0.24%
direct                                               0K               0K                -                0.00%
mapped                                               0K               0K                -                0.00%
Runtime
os.name                                                                                                                    Mac OS X
os.version                                                                                                                 10.16
java.version                                                                                                               1.8.0_201
java.home                                                                                                                  /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre
systemload.average                                                                                                         6.26
processors                                                                                                                 10
timestamp/uptime                                                                                                           Sun Jun 23 12:01:47 CST 2024/536s
[arthas@77952]$ heapdump /tmp/dump-1.hprof

Error: -F option used
Cannot connect to core dump or remote debug server. Use jhsdb jmap instead
Java9之后jmap -F等动态attach模式需使用jhsdb代替。

[root@VM-4-5-centos ~]# jps -lm
7491 jdk.jcmd/sun.tools.jps.Jps -lm
19513 org.apache.catalina.startup.Bootstrap start
20094 cn.edu.gxust.blogex.api.BlogExApiApplication
[root@VM-4-5-centos ~]# jhsdb jmap --heap --pid 20094
Attaching to process ID 20094, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 17.0.6+9-LTS-190using thread-local object allocation.
Garbage-First (G1) GC with 2 thread(s)Heap Configuration:MinHeapFreeRatio         = 40MaxHeapFreeRatio         = 70MaxHeapSize              = 1073741824 (1024.0MB)NewSize                  = 1363144 (1.2999954223632812MB)MaxNewSize               = 643825664 (614.0MB)OldSize                  = 5452592 (5.1999969482421875MB)NewRatio                 = 2SurvivorRatio            = 8MetaspaceSize            = 22020096 (21.0MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 17592186044415 MBG1HeapRegionSize         = 1048576 (1.0MB)Heap Usage:
G1 Heap:regions  = 1024capacity = 1073741824 (1024.0MB)used     = 101319680 (96.6259765625MB)free     = 972422144 (927.3740234375MB)9.43613052368164% used
G1 Young Generation:
Eden Space:regions  = 36capacity = 160432128 (153.0MB)used     = 37748736 (36.0MB)free     = 122683392 (117.0MB)23.529411764705884% used
Survivor Space:regions  = 7capacity = 8388608 (8.0MB)used     = 7864320 (7.5MB)free     = 524288 (0.5MB)93.75% used
G1 Old Generation:regions  = 55capacity = 99614720 (95.0MB)used     = 55706624 (53.1259765625MB)free     = 43908096 (41.8740234375MB)55.92208059210526% used[root@VM-4-5-centos ~]# java -version
java version "17.0.6" 2023-01-17 LTS
Java(TM) SE Runtime Environment (build 17.0.6+9-LTS-190)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.6+9-LTS-190, mixed mode, sharing)

jmap -heap $PID

[hadoop@dev]$ jmap -heap 24464
Attaching to process ID 24464, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11using thread-local object allocation.
Parallel GC with 4 thread(s)Heap Configuration:MinHeapFreeRatio         = 0MaxHeapFreeRatio         = 100MaxHeapSize              = 1644167168 (1568.0MB)NewSize                  = 357564416 (341.0MB)MaxNewSize               = 547880960 (522.5MB)OldSize                  = 716177408 (683.0MB)NewRatio                 = 2SurvivorRatio            = 8MetaspaceSize            = 21807104 (20.796875MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 17592186044415 MBG1HeapRegionSize         = 0 (0.0MB)Heap Usage:
PS Young Generation
Eden Space:capacity = 470286336 (448.5MB)used     = 295203328 (281.52783203125MB)free     = 175083008 (166.97216796875MB)62.77097704152731% used
From Space:capacity = 36175872 (34.5MB)used     = 7907344 (7.5410308837890625MB)free     = 28268528 (26.958969116210938MB)21.85806053272192% used
To Space:capacity = 35651584 (34.0MB)used     = 0 (0.0MB)free     = 35651584 (34.0MB)0.0% used
PS Old Generationcapacity = 790626304 (754.0MB)used     = 131458176 (125.3682861328125MB)free     = 659168128 (628.6317138671875MB)16.627093651566646% used55933 interned Strings occupying 5650672 bytes.

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

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

相关文章

多模态-大模型:MLLM综述(适用初学)

文章目录 前言一、多模态模型基础知识二、多模态指令调优&#xff08;M-IT&#xff09;1.MLLM基础2.模态对齐3.数据获取4.模态桥接 三、多模态上下文学习&#xff08;M-ICL&#xff09;三、多模态思维链 (M-CoT)四、LLM辅助视觉推理1.训练范式2. LLM功能 五、一些思考总结 前言…

OS中断机制-外部中断触发

中断函数都定义在中断向量表中,外部中断通过中断跳转指令触发中断向量表中的中断服务函数,中断指令可以理解为由某个中断寄存器的状态切换触发的汇编指令,这个汇编指令就是中断跳转指令外部中断通过在初始化的时候使能对应的中断服务函数如何判断外部中断被触发的条件根据Da…

关于ONLYOFFICE8.1版本桌面编辑器测评——AI时代的领跑者

关于作者&#xff1a;个人主页 目录 一.产品介绍 1.关于ONLYOFFICE 2.关于产品的多元化功能 二.关于产品体验方式 1.关于套件的使用网页版登录 2.关于ONLYOFFICE本地版 三.关于产品界面设计 四.关于产品文字处理器&#xff08;Document Editor&#xff09; 1.电子表格&a…

昇思25天学习打卡营第6天 | 函数式自动微分

神经网络的训练主要使用反向传播算法&#xff0c; 模型预测值&#xff08;logits&#xff09;与正确标签&#xff08;label&#xff09;送入损失函数&#xff08;loss function&#xff09;获得loss&#xff0c; 然后进行反向传播计算&#xff0c;求得梯度&#xff08;gradie…

数据中心 250KW 水冷负载组概述

该负载专为数据中心冷水机组调试和测试应用而设计, 是一款紧凑的便携式产品&#xff0c;具有无限功率和水流控制功能&#xff0c;可实现精确的温升设置与施加的功率。鹦鹉螺是完全可联网的&#xff0c;可以从远程站控制单个或多个单元。 使用带有触摸屏 HMI 的 PLC&#xff0c;…

Navicat连接Oracle出现Oracle library is not loaded的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 使用Navicat链接Oracle的时候,出现如下提示:Oracle library is not loaded. 截图如下所示: 2. 原理分析 通常是由于缺少必需的 Oracle 客户端库或环境变量未正确配置所致 还有一种情况是 32位与64位的不匹配:Navica…

基于Langchain-chatchat搭建本地智能知识问答系统

基于Langchain-chatchat搭建本地智能 搭建本地智能知识问答系统&#xff1a;基于Langchain-chatchat的实践指南引言项目概述环境安装Anacondapip 项目安装步骤大语言模型&#xff08;LLM&#xff09;的重要性结语 搭建本地智能知识问答系统&#xff1a;基于Langchain-chatchat的…

记错医院预约的日期,选择加号还是回去?

记错了去医院的日期&#xff0c;起了个大早&#xff0c;用了 90 分钟才到医院&#xff0c;取号时提示没有预约的号&#xff0c;才发现记错时间了。这个时候是选择找医生加号还是直接回去呢&#xff1f;如果是你怎么选择&#xff1f; 如果选择找医生加号&#xff0c;号会排到最后…

STM32 ---- F1系列内核和芯片系统架构 || 存储器映像 || 寄存器映射

一&#xff0c;存储器映像 STM32 寻址范围&#xff1a;2^32 4 * 2^10 *2^10 K 4 * 2^10 M 4G 地址所访问的存储单元是按字节编址的。 0x0000 0000 ~ 0xFFFF FFFF 什么是存储器映射&#xff1f; 存储器本身不具有地址信息&#xff0c;给存储器分配地址的…

STM32单片机WDG看门狗详解

文章目录 1. WDG简介 2. IWDG框图 3. IWDG键寄存器 4. IWDG超时时间 5. WWDG框图 6. WWDG工作特性 7. WWDG超时时间 8. IWDG和WWDG对比 9. 代码示例 1. WDG简介 WDG&#xff08;Watchdog&#xff09;看门狗 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计…

Docker Compose--安装Nginx--方法/实例

原文网址&#xff1a;Docker Compose--安装Nginx--方法/实例_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Docker Compose如何安装Nginx。 目录结构 ├── config │ ├── cert │ │ ├── xxx_bundle.pem │ │ └── xxx.key │ ├── conf.d │ …

【ONLYOFFICE震撼8.1】ONLYOFFICE8.1版本桌面编辑器测评

随着远程工作的普及和数字化办公的发展&#xff0c;越来越多的人开始寻找一款具有强大功能和便捷使用的办公软件。在这个时候&#xff0c;ONLYOFFICE 8.1应运而生&#xff0c;成为了许多用户的新选择。ONLYOFFICE 8.1是一种办公套件软件&#xff0c;它提供了文档处理、电子表格…

jupyter中如何看plt.plot的局部细节

在Jupyter中使用matplotlib时&#xff0c;如果你想要放大图表的某一部分&#xff0c;可以使用matplotlib的交互式方式查看局部细节。 %matplotlib notebook # 在Jupyter中使用交互式后端 import matplotlib.pyplot as plt import numpy as np# 生成数据 x np.linspace(0, 10…

TiDB 资源管控的对撞测试以及最佳实践架构

作者&#xff1a; GreenGuan 原文来源&#xff1a; https://tidb.net/blog/bc405c21 引言 TiDB 是一个存算分离的架构&#xff0c;资源管控对这种分离的架构来说实现确实有非常大的难度&#xff0c;TiDB 从 7.1 版本开始引入资源管控的概念&#xff0c;在社区也有不少伙伴测…

论文速递 | Management Science 4月文章合集(下)

编者按 在本系列文章中&#xff0c;我们梳理了运筹学顶刊Management Science在2024年4月份发布有关OR/OM以及相关应用的13篇文章的基本信息&#xff0c;旨在帮助读者快速洞察领域新动态。本文为第二部分&#xff08;2/2&#xff09;。 推荐文章1 ● 题目&#xff1a;Social Le…

模拟面试之外卖点单系统(高频面试题目mark)

今天跟大家分享一个大家简历中常见的项目-《外卖点单系统》&#xff0c;这是一个很经典的项目&#xff0c;有很多可以考察的知识点和技能点&#xff0c;但大多数同学都是学期项目&#xff0c;没有实际落地&#xff0c;对面试问题准备不充分&#xff0c;回答时抓不到重点&#x…

Handling `nil` Values in `NSDictionary` in Objective-C

Handling nil Values in NSDictionary in Objective-C When working with Objective-C, particularly when dealing with data returned from a server, it’s crucial (至关重要的) to handle nil values appropriately (适当地) to prevent unexpected crashes. Here, we ex…

VBA递归过程快速组合数据

实例需求&#xff1a;数据表包含的列数不固定&#xff0c;有的列&#xff08;数量和位置不固定&#xff09;包含组合数据&#xff0c;例如C2单元格为D,P&#xff0c;说明Unit Config有两种分别为D和P&#xff0c;如下图所示。 现在需要将所有的组合罗列出来&#xff0c;如下所示…

git上传本地项目及更新项目

1、注册GitHub账号和下载git 2、在GitHub上新建一个仓库&#xff0c;点击号——>New repository&#xff0c;给仓库起一个名字&#xff0c;点击Create repository 3、进入要上传的项目中&#xff0c;右键点击git back here&#xff0c;命令行输入git init初始化&#xff0c…

全球电力电子测试方案专业提供商「艾诺仪器」×企企通召开项目启动会,推进企业采购数智化升级

导读 供应链管理已成为企业的核心竞争力之一&#xff0c;为应对快速变化的市场环境&#xff0c;艾诺仪器亟需强化采购管理和供应链协同的竞争力。SRM涉及到各事业部、各所属企业等多个层面&#xff0c;希望通过双方优势资源的整合&#xff0c;打造高效协同、科学智能的数字化采…