我是靠谱客的博主 温暖纸鹤,最近开发中收集的这篇文章主要介绍MAT定位OOM溢出源,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前期准备:

配置oom自动dump jvm快照:-XX :+HeapDumpOnOutOfMemoryError

分析过程:

1)MAT中导入java_pid17932.hprof jvm快照,查看histogram 信息

注:Shallow Heap:对象自身不包含引用的大小;Retained Heap:对象自身及对象相关引用的大小

结论:如图,可得出每个类产生的实例数量(Objects栏),以及所占用的内存大小。从而能定位到占用内存最多的几个类

2)分析GCRoot引用(选中大类,右击)

注:GC Roots意为GC根节点,其中 exclude all phantom/weak/soft etc. reference 意思是排除虚引用、弱引用和软引用,即只剩下强引用,因为除了强引用之外,其他的引用都可以被JVM GC掉,如果一个对象始终无法被GC,就说明有强引用存在,从而导致在GC的过程中一直得不到回收,最终就内存溢出了。

3)结合日志oom报错定位代码块

结论:可以很方便的定位到具体的代码,然后分析是什么原因无法释放该对象。

这里是在OOMTest类里写了个list.add死循环,在list扩容方法时堆内存不够导致内存溢出。

总结

1.histhistogram找到占用多的类

2.只看强yiny引用,对象的gcroot 定位到哪个对象没被gc

3.结合报错日志,定位具体代码

最后

以上就是温暖纸鹤为你收集整理的MAT定位OOM溢出源的全部内容,希望文章能够帮你解决MAT定位OOM溢出源所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部