常见OOM异常分析排查

news/2024/11/19 4:26:34/

常见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-b12using thread-local object allocation.
Mark Sweep Compact GCHeap 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% used10730 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.ppmy.cn/news/1000052.html

相关文章

eNSP interface g0/0/0 报错解决办法

文章目录 1 报错截图2 解决办法2.1 排查设备是否有 GM 接口2.2 更换适合的路由器&#xff0c;并验证 1 报错截图 2 解决办法 2.1 排查设备是否有 GM 接口 查看下设备是否支持 GM 接口&#xff08;GigabitEthernet&#xff09; 方式一&#xff1a;右键路由器设备 - 设置 - 查看…

jQuery如何获取动态添加的元素

jQuery如何获取动态添加的元素 使用 on()方法 本质上使用了事件委派&#xff0c;将事件委派在父元素身上 自 jQuery 版本 1.7 起&#xff0c;on() 方法是 bind()、live() 和 delegate() 方法的新的替代品&#xff0c;但是由于on()方法必须有事件&#xff0c;没有事件时可选择de…

Rpc异步日志模块

Rpc异步日志模块作用 在一个大型分布式系统中&#xff0c;任何部署的分布式节点都可能发生崩溃&#xff0c;试想如果用普通的办法&#xff0c;即先排查哪个节点down掉了&#xff0c;找到down掉的节点后采取调试工具gdb调试该节点&#xff0c;进而排查宕机的原因。这中排查方法…

如何通过 5 步激活策略扩大用户群

假设&#xff0c;你现在是一个“深藏功与名”的增长黑客。前期你表现非常好&#xff0c;做了一些拉新实验&#xff0c;每天都有上千用户进入到产品。团队成员和家人朋友都非常开心你们的产品增长终于有了起色。 然而&#xff0c;如果你不重视拉新&#xff08;acquisition&…

Eureka 学习笔记2:EurekaClient

版本 awsVersion ‘1.11.277’ EurekaClient 接口实现了 LookupService 接口&#xff0c;拥有唯一的实现类 DiscoveryClient 类。 LookupService 接口提供以下功能&#xff1a; 获取注册表根据应用名称获取应用根据实例 id 获取实例信息 public interface LookupService<…

Python系统学习1-2

目录 一、硬件 二、软件&#xff1a;程序文档 三、基础知识 四、python执行过程 五、Pycharm使用技巧 一、硬件 计算机五大部件&#xff1a;运算器&#xff0c;存储器&#xff0c;控制器、输入设备&#xff0c;输出设备。 运算器和控制器 集成在CPU中。 存储&#xff1a…

爬虫教程1_Xpath 入门教程

Xpath 入门教程 在编写爬虫程序的过程中提取信息是非常重要的环节&#xff0c;但是有时使用正则表达式无法匹配到想要的信息&#xff0c;或者书写起来非常麻烦&#xff0c;此时就需要用另外一种数据解析方法&#xff0c;也就是本节要介绍的 Xpath 表达式。 Xpath表达式 XPath…

每日一道面试题之Iterator 和 ListIterator 有什么区别?

Iterator 和 ListIterator 都是 Java 集合框架中用于遍历集合元素的接口&#xff0c;但它们有一些区别: 使用的范围&#xff1a;Iterator可以迭代所有集合,而ListIterator 只能用于List及其子类。 继承关系&#xff1a;ListIterator 继承 Iterator&#xff0c;并且ListIterat…