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

本文详细探讨了Java堆内存的结构、分区、垃圾收集机制以及如何进行性能优化,旨在帮助开发者更好地理解和诊断Java应用程序的内存问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,内存溢出(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完全一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值