一次OOM问题排查

本文记录了一种使用jhat命令和MemoryAnalyzer工具排查Java OutOfMemory(OOM)问题的方法。首先,通过jhat命令分析堆快照,观察堆统计信息,查找可能的内存占用大户。然后,利用MemoryAnalyzer工具进行深入分析,它能自动检测可能的内存泄漏原因,并提供详细的引用链,帮助定位问题。在这个例子中,问题被发现是由于日志打印过于频繁导致的内存溢出。
摘要由CSDN通过智能技术生成

同事排查oom问题,并且告诉了我方法,纪录一下,一个很方便的插件。
前提是保存了堆快照,如果没有那就猜去吧。

  • 使用jhat命令
jhat XX.hprof

在这里插入图片描述
浏览器打开localhost:7000
最下方可以看到,常用的功能
在这里插入图片描述
最常用的应该是查看堆统计信息,点击跳转到localhost:7000/histo/
在这里插入图片描述
这里排查的话建议先根据报名查询一下自己的项目的类的实例,看下最多的占用多少,如果数量和空间很大,那么多半就是它导致的,如果发现占用很少,那就麻烦了,可能哪里有一个集合,存了太多字符串或者数字或者类型的实例导致的,也可能是哪个依赖存在内存泄漏。
这里可以点进去,比如最大的那个class[C char数组,对应的当然是字符串,进去以后可以看下是不是很多大对象,我这个没有太多大的。
在这里插入图片描述
如果存在异常的大的,可以点进去看看引用它的地方,如果是字符串,就可以看到字符串内容:
在这里插入图片描述
如果到了这里没有思路。

  • 内存分析工具MemoryAnalyzer
    点击上面可以下载,也可以下载eclipse然后安装插件,之前我就是这样的,但是后来同时发我了独立版,方便很多,毕竟开发是用idea
    打开并加载堆快照文件
    在这里插入图片描述
    直接可以看到堆概况
    在这里插入图片描述
    同时,它还会自动分析泄漏原因,像我这个自动就把泄漏原因找到了,是因为日志打印过于频繁导致的
One instance of "ch.qos.logback.classic.AsyncAppender" loaded by "org.springframework.boot.loader.LaunchedURLClassLoader @ 0xe001a7c0" occupies 345,241,648 (83.84%) bytes. The memory is accumulated in one instance of "java.lang.Object[]" loaded by "<system class loader>".

可以看到一个实例引用了83%的空间。
如果它自动分析的不对(实际上还是蛮对的),可以自己看
在这里插入图片描述
这里就相当于jhat的那个堆统计信息页面了
在这里插入图片描述
进来可以看到,自动根据内存占用找到引用并可以层层查看,其实大部分情况下就能找到原因了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值