Jvm知识学习(八)-Java堆分析

一,内存溢出(OOM)的原因
1,JVM内存区间可以简单的分为:堆,永久区,线程栈,直接内存
2,内存溢出的几种:
(1)堆内存溢出:


(2)永久区内存溢出:

(3)Java栈内存溢出:


(4)直接内存溢出:



备注说明:直接内存需要GC回收,但是直接内存无法引起GC。直接内存使用满时,无法触发GC。
如果堆空间很富余,无法触发GC,直接内存可能就会溢出。如果堆空间触发GC,直接内存可以回收

二,MAT使用基础



支配树的说明:

分析堆总体信息,查看对象消耗内存的比例:
显示入引用(incoming)和出引用(outgoing):

浅堆(Shallow Heap)与深堆(Retained Heap):


浅堆(Shallow Heap)与深堆(Retained Heap)示例说明:
(1)运行代码如下所示

(2)分析图:

(3)堆信息:

分析:可以看到,所有的Point实例浅堆和深堆的大小都是16字节。而dLine对象,浅堆为16字节,深堆也是16字节,这是因为dLine对象内的两个点f和g没有被设置为null,因此,即使dLine被回收,f和g也不会被释放。对象cLine内的引用对象d和e由于仅在cLine内还存在引用,因此只要cLine被释放,d和e必然也作为垃圾被回收,即d和e在cLine的保留集内,因此cLine的深堆为16*2+16=48字节。
对于aLine和bLine对象,由于两者均持有对方的一个点,因此,当aLine被回收时,公共点a在bLine中依然有引用存在,故不会被回收,点a不在aLine对象的保留集中,因此aLine的深堆大小为16+16=32字节。对象bLine与aLine完全一致。

猜你喜欢

转载自blog.csdn.net/hhq12/article/details/80940702