常见OOM异常分析排查

news2024/12/23 13:20:19

常见OOM异常分析排查

    • Java内存溢出
    • Java堆溢出原因
    • 解决思路
    • 总结

Java内存溢出

java堆用于存储对象实例,如果不断地创建对象,并且保证GC Root到对象之间有可达路径,垃圾回收机制就不会清理这些对象,对象数量达到最大堆的容量限制后就会产生内存溢出异常.

Java堆溢出原因

  • 无法在java堆中分配对象
  • 应用程序保存了无法被GC回收的对象
  • 应用程序过度使用finalizer

解决思路

  1. 查找关键报错信息如
java.lang.StackOverflowError
java.lang.OutOfMemoryError:java heap space
java.lang.OutOfMemoryError:GC overhead limit exceeeded
java.lang.OutOfMemoryError:Direct buffer memory
java.lang.OutOfMemoryError:unable to create new native thread
java.lang.OutOfMemoryError:Metaspace
  1. 找到java进程的ID(PID),使用 jps -vl 命令即可找到java进程的PID和启动时设置的jvm参数。
jps -vl
  1. 查看新生代,老年代堆内存的分配大小以及使用情况
jmap -heap PID
[xxx@xxx ~]# jmap -heap 15162
Attaching to process ID 15162, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12

using thread-local object allocation.
Mark Sweep Compact GC

Heap Configuration:
   MinHeapFreeRatio         = 40 # 最小堆使用比例
   MaxHeapFreeRatio         = 70 # 最大堆可用比例
   MaxHeapSize              = 482344960 (460.0MB) # 最大堆空间大小
   NewSize                  = 10485760 (10.0MB) # 新生代分配大小
   MaxNewSize               = 160759808 (153.3125MB) # 最大新生代可分配大小
   OldSize                  = 20971520 (20.0MB) # 老年代大小
   NewRatio                 = 2 # 新生代比例
   SurvivorRatio            = 8 # 新生代与 Survivor 比例
   MetaspaceSize            = 21807104 (20.796875MB) # 元空间大小
   CompressedClassSpaceSize = 1073741824 (1024.0MB) # Compressed Class Space 空间大小限制
   MaxMetaspaceSize         = 17592186044415 MB # 最大元空间大小
   G1HeapRegionSize         = 0 (0.0MB) # G1 单个 Region 大小

Heap Usage:  # 堆使用情况
New Generation (Eden + 1 Survivor Space): # 新生代
   capacity = 9502720 (9.0625MB) # 新生代总容量
   used     = 4995320 (4.763908386230469MB) # 新生代已使用
   free     = 4507400 (4.298591613769531MB) # 新生代剩余容量
   52.56726495150862% used # 新生代使用占比
Eden Space:  
   capacity = 8454144 (8.0625MB) # Eden 区总容量
   used     = 4029752 (3.8430709838867188MB) # Eden 区已使用
   free     = 4424392 (4.219429016113281MB) # Eden 区剩余容量
   47.665996699370154% used  # Eden 区使用占比
From Space: # 其中一个 Survivor 区的内存分布
   capacity = 1048576 (1.0MB)
   used     = 965568 (0.92083740234375MB)
   free     = 83008 (0.07916259765625MB)
   92.083740234375% used
To Space: # 另一个 Survivor 区的内存分布
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
tenured generation: # 老年代
   capacity = 20971520 (20.0MB)
   used     = 10611384 (10.119804382324219MB)
   free     = 10360136 (9.880195617675781MB)
   50.599021911621094% used

10730 interned Strings occupying 906232 bytes.
  1. 查询最耗内存的对象,会以表格的形式显示存活对象的信息,并按照所占内存大小排序,信息有 排名,实例数,所占内存大小,类名
jmap -histo:live PID | more
  1. Dump文件分析
    Dump 文件是 Java 进程的内存镜像,其中主要包括 系统信息、虚拟机属性、完整的线程 Dump、所有类和对象的状态 等信息.
    JVM 启动参数配置添加以下参数
  • -XX:+HeapDumpOnOutOfMemoryError
  • -XX:HeapDumpPath=./(参数为 Dump 文件生成路径)
    JVM 启动参数配置添加以下参数
    上面配置是在应用抛出 OOM 后自动导出 Dump,或者可以在 JVM 运行时导出 Dump 文件
jmap -dump:file=[文件路径] [pid]

# 示例
jmap -dump:file=./jvmdump.hprof 15892

Demo

设置 VM 参数:-Xms3m -Xmx3m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./

public static void main(String[] args) {
    List<Object> oomList = Lists.newArrayList();
  	// 无限循环创建对象
    while (true) {
        oomList.add(new Object());
    }
}

在这里插入图片描述
在这里插入图片描述

总结

线上如遇到 JVM 内存溢出,可以分以下几步排查
jmap -heap 查看是否内存分配过小

jmap -histo 查看是否有明显的对象分配过多且没有释放情况

jmap -dump 导出 JVM 当前内存快照,使用 JDK 自带或 MAT 等工具分析快照

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

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

相关文章

mysql月统计数据,没有的填充为0

要按时间戳字段按月份分组查询记录表&#xff0c;可以使用DATE_FORMAT函数将时间戳字段格式化为年月格式&#xff0c;然后将结果按照该字段进行分组。 SELECT a.month month,ifnull(b.count, 0) count FROM (SELECT 1 month UNION ALL SELECT 2 month UNION ALL SELECT 3 mont…

为何企业和开发团队应该重视进行兼容性测试

随着科技的不断进步和软件的广泛应用&#xff0c;保证软件在不同平台和环境下正常运行变得至关重要。本文将探讨软件兼容性测试的重要性和好处&#xff0c;并介绍为何企业和开发团队应该重视进行兼容性测试&#xff0c;以确保软件的稳定性和用户体验。 提供用户友好的体验 软件…

xcode 的app工程与ffmpeg 4.4版本的静态库联调,ffmpeg内下的断点无法暂停。

先阐述一下我的业务场景&#xff0c;我有一个iOS的app sdk项目&#xff0c;下面简称 A &#xff0c;以及运行 A 的 app 项目&#xff0c;简称 A demo 。 引用关系为 A demo 引用了 A &#xff0c;而 A 引用了 ffmpeg 的静态库&#xff08;.a文件&#xff09;。此时业务出现了 b…

线程、进程和管程

一、线程 1.1 定义 线程&#xff1a;线程是进程中的实体&#xff0c;一个进程可以拥有多个线程&#xff0c;一个线程必须有一个父进程。线程有时被称为轻量级进程&#xff0c;是程序执行流的最小单元。 线程的组成部分&#xff1a; 1. 线程ID&#xff1a;线程标识符 2. 当前…

【python】python求解矩阵的转置(详细讲解)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Linux服务器安装JDK20

一、下载安装包 访问官网&#xff0c;找到JDK20&#xff0c;复制下载链接 我复制的链接是&#xff1a;JDK20 二、Linux服务器操作 1.服务器根目录下创建一个新的文件夹 cd /mkdir jdkscd /jdks2.将下载好的jdk-20上传到jdks下 3.解压缩 tar -zxvf jdk-20_linux-x64_bin.tar…

ClickHouse目录结构

默认安装路径&#xff1a;/var/lib/clickhouse/ 目录结构&#xff1a; 主要介绍metadata和data metadata 其中的default、system及相应的数据库&#xff0c;.sql文件即数据库创建相关sql语句 进入default数据库&#xff08;默认数据库&#xff09;&#xff1a; 可以看到数据库…

Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业 tbms

&#xfeff;功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&…

明星广告代言指南:遵循行业规范保持诚信

明星广告代言是一种常见的市场营销策略&#xff0c;通过邀请知名明星为品牌或产品代言&#xff0c;以增加品牌曝光和销售额。媒介拥有的3000多位一二线明星的合作资源&#xff0c;包括演员、歌手、主持人等各种类型的明星&#xff0c;可以为企业提供签售会、产品发布会、品牌推…

手写一个锁其实也很easy

懵逼的状态&#xff1a; 面试中经常被问到&#xff0c;如何手写一个锁&#xff0c;很多时候一脸懵逼&#xff0c;不知所措&#xff0c;多少年前深有体会&#xff0c;然而回过头来细细分析&#xff0c;只需使用AtomicReference类 即可以轻松搞定。首先咱们先来了解一下Atomi…

6.s081/6.1810(Fall 2022)Lab2: System calls

文章目录 前言其他篇章参考链接0. 前置准备1. System call tracing (moderate)简单分析Hint 1Hint 2Hint 3Hint 4Hint 5测试 2. Sysinfo (moderate)声明实现框架用户态与内核态交互计算空闲内存的大小计算非UNUSED进程的数量 测试 3. 总测试 前言 这个lab主要介绍了用户态到内…

【Java】Map<String,Object>中解析Object类型数据为数组格式(94)

背景&#xff1a; 前端&#xff1a;入参为字符串和数组类型&#xff1b;通过json字符串传给后台&#xff0c; 后台&#xff1a;后台通过工具解析为Map<String&#xff0c;Object>&#xff0c;然后需要解析出Map里面的数组值做操作&#xff1b; 需求&#xff1a; 入参&…

Vue源码学习 - 模版编译 和 组件渲染/更新过程

目录 前言一、什么是 模板编译&#xff1f;二、模板编译 到 render 函数字符串的流程三、深入模板编译源码baseCompile ()parse() - 解析阶段optimize() - 优化阶段generate() - 生成阶段&#xff08;1&#xff09;了解 render函数字符串 和 with 语法&#xff08;2&#xff09…

PHP手术麻醉信息系统的功能作用

手术麻醉信息系统源码 手术麻醉信息系统的使用&#xff0c;很大程度上方便了麻醉科医生的日常工作&#xff0c;使麻醉工作流程更规范&#xff0c;为麻醉医生工作提供了一个新平台。下面简述一下该系统在日常麻醉工作中的作用。 (一) 及时合理地安排手术 麻醉信息系统与医院现…

初识C++:类与对象

前言&#xff08;类的引入&#xff09; C语言结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。比如&#xff1a; 之前在C语言中&#xff0c;用C语言方式实现的栈&#xff0c;结构体中只能定义变量&#xff1b;现在以C方…

【第一阶段】编译时常量

1.编译时常量只能是常用的基本数据类型 String Double Int Float Long Short Byte Char Boolean 2.const用于定义编译时常量类似final,如果我们用在局部变量中将会报错&#xff0c;代码示例 fun main() {//使用const修饰为常量,编译时常量只能是常用的基本数据类型 String Dou…

学习C语言第三天 :分支语句(if - else if - else)

1.C语言语句结构 C语言是结构化的程序设计语言&#xff0c;这里的结构指的是顺序结构、选择结构、循环结构&#xff0c;C语言是能够实现这三种结构的&#xff0c;其实我们如果仔细分析&#xff0c;我们日常所见的事情都可以拆分为这三种结构或者这三种结构的组合。 我们可以使用…

python爬虫 获取简单的get请求

打印结果&#xff1a; 原博主写的很厉害额&#xff0c;写的比较全面&#xff0c;大家可以去学习看看 参考原文&#xff1a; Python调用get或post请求外部接口_python调用post接口_纯洁的小魔鬼的博客-CSDN博客

封装动态SQL的插件

最近根据公司的业务需要封装了一个简单的动态SQL的插件&#xff0c;要求是允许用户在页面添加SQL的where条件&#xff0c;然后开发者只需要给某个接口写查询对应的表&#xff0c;参数全部由插件进行拼接完成。下面是最终实现&#xff1a; 开发人员只需要在接口写上下面的查询SQ…

从零构建深度学习推理框架-3 手写算子relu

Relu介绍&#xff1a; relu是一个非线性激活函数&#xff0c;可以避免梯度消失&#xff0c;过拟合等情况。我们一般将thresh设为0。 operator类&#xff1a; #ifndef KUIPER_COURSE_INCLUDE_OPS_OP_HPP_ #define KUIPER_COURSE_INCLUDE_OPS_OP_HPP_ namespace kuiper_infer {…