OOM日志分析

2024-06-23 18:20
文章标签 分析 日志 oom

本文主要是介绍OOM日志分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1. 日志分析
  • 2. MAT 工具
    • 2.1 日志打印方式
      • 2.1.1 HeapDumpOnOutOfMemoryError(推荐)
      • 2.1.2 jmp 命令
    • 2.2 MAT分析方式
      • 2.2.1 饼图分析
      • 2.2.2 树形图分析
      • 2.2.2 泄漏疑点
  • 3. 优化

首先说一下结论:通过MAT工具分析才是最精准的,直接通过日志排查可能不是主要原因。

1. 日志分析

直接从日志文件定位 (不精准)
在这里插入图片描述
可以看到这是个 OutOfMemoryError内存溢出异常,Java heap space 表示java堆内存溢出。并且 at org.example.controller.Test.test(Test.java:27) 指定了具体位置,找到具体代码就能定位问题。
在这里插入图片描述
上面的方法不一定是精准的,有可能其他地方占用了百分之80内存,刚好一个低内存方法创建对象的时候OOM,所以这种方式存在误判性。

2. MAT 工具

2.1 日志打印方式

通过打印dump文件通过MAT工具查看。
打印dump文件方式有两种,一种是在启动jar包添加 -XX:+HeapDumpOnOutOfMemoryError (推荐),一种是执行 jmp -dump命令

2.1.1 HeapDumpOnOutOfMemoryError(推荐)

在启动jar包时,添加-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapdump.hprof,在服务OOM时会打印dump文件到当前目录heapdump.hprof文件中,然后通过MAT工具查看

例如:通过 nohup java -Xms512m -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapdump.hprof -jar byzq-yc.jar > ./byzq-yc.log 2>&1 & 启动服务。

将 heapdump.hprof文件拷贝出来,打开MAT工具,选择File -> Open File -> 选择 heapdump.hprof
在这里插入图片描述

加载完后,点击 Finish

在这里插入图片描述

2.1.2 jmp 命令

首先使用 jps 查看进程ID,或者top查看内存较高进程ID,然后使用jmap来生成堆转储文件:

jmap -dump:live,format=b,file=heapdump.dat<PID>

后续跟前面一样,通过mat工具分析即可

2.2 MAT分析方式

2.2.1 饼图分析

直接根据饼图分析,占用最大的这部分多半就是引起OOM的元凶,实际可能会存在多个占用比例比较大的,逐个分析就好
在这里插入图片描述
通过 Java Basics -> Thread Details 或 Thread Overview and Stacks 都可以找到对应的代码位置
在这里插入图片描述
在这里插入图片描述

2.2.2 树形图分析

点击 Dominator Tree 我们能看到线程树形的内存占比
在这里插入图片描述
可以看到这个Object 占比比较高,同样通过 Java Basics -> Thread Details 或 Thread Overview and Stacks 都可以找到对应的代码位置
在这里插入图片描述

2.2.2 泄漏疑点

点击 Leak Suspects 可以直接查看到一个报错信息
在这里插入图片描述
点击Details
在这里插入图片描述
不仅可以查看到一个内存占比,还能查看到报错信息
在这里插入图片描述

3. 优化

分析具体原因后,考虑是代码原因则优化代码。如果代码问题不大则考虑提升堆内存空间

这篇关于OOM日志分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087923

相关文章

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

高度内卷下,企业如何通过VOC(客户之声)做好竞争分析?

VOC,即客户之声,是一种通过收集和分析客户反馈、需求和期望,来洞察市场趋势和竞争对手动态的方法。在高度内卷的市场环境下,VOC不仅能够帮助企业了解客户的真实需求,还能为企业提供宝贵的竞争情报,助力企业在竞争中占据有利地位。 那么,企业该如何通过VOC(客户之声)做好竞争分析呢?深圳天行健企业管理咨询公司解析如下: 首先,要建立完善的VOC收集机制。这包括通过线上渠道(如社交媒体、官网留言

Sapphire开发日志 (十) 关于页面

关于页面 任务介绍 关于页面用户对我组工作量的展示。 实现效果 代码解释 首先封装一个子组件用于展示用户头像和名称。 const UserGrid = ({src,name,size,link,}: {src: any;name: any;size?: any;link?: any;}) => (<Box sx={{ display: "flex", flexDirecti

打包体积分析和优化

webpack分析工具:webpack-bundle-analyzer 1. 通过<script src="./vue.js"></script>方式引入vue、vuex、vue-router等包(CDN) // webpack.config.jsif(process.env.NODE_ENV==='production') {module.exports = {devtool: 'none

Java中的大数据处理与分析架构

Java中的大数据处理与分析架构 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来讨论Java中的大数据处理与分析架构。随着大数据时代的到来,海量数据的存储、处理和分析变得至关重要。Java作为一门广泛使用的编程语言,在大数据领域有着广泛的应用。本文将介绍Java在大数据处理和分析中的关键技术和架构设计。 大数据处理与

段,页,段页,三种内存(RAM)管理机制分析

段,页,段页         是为实现虚拟内存而产生的技术。直接使用物理内存弊端:地址空间不隔离,内存使用效率低。 段 段:就是按照二进制文件的格式,在内存给进程分段(包括堆栈、数据段、代码段)。通过段寄存器中的段表来进行虚拟地址和物理地址的转换。 段实现的虚拟地址 = 段号+offset 物理地址:被分为很多个有编号的段,每个进程的虚拟地址都有段号,这样可以实现虚实地址之间的转换。其实所谓的地

mediasoup 源码分析 (八)分析PlainTransport

mediasoup 源码分析 (六)分析PlainTransport 一、接收裸RTP流二、mediasoup 中udp建立过程 tips 一、接收裸RTP流 PlainTransport 可以接收裸RTP流,也可以接收AES加密的RTP流。源码中提供了一个通过ffmpeg发送裸RTP流到mediasoup的脚本,具体地址为:mediasoup-demo/broadcaste

linux匹配Nginx日志,某个字符开头和结尾的字符串

匹配 os=1 开头, &ip结尾的字符串 cat 2018-06-07.log | egrep -o ‘os=1.*.&ip’ 存入日志。然后使用submit 前面和后面的值去掉,剩下就是需要的字符串。 cat 2018-06-07.log | egrep -o ‘os=1.*.&ip’ >log.log

Java并发编程—阻塞队列源码分析

在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。   在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了D

线程池ThreadPoolExecutor类源码分析

Java并发编程:线程池的使用   在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:   如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。   那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?