java内存区域与内存溢出异常

java对象的内存布局

在Hotspot虚拟机中,对象在内存中存储布局可以分为三个区域:对象头、实例数据、对齐填充。

对象头:分为两部分,一部分存储对象自身运行时数据,如哈希码、GC分代年龄、线程持有锁等;另外一部份存储类型指针,即对象指向它的类元数的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

* java对象的访问定位*

目前主流的访问方式有使用句柄和直接指针两种。
**句柄:**java堆中会划分一块内存用来作为句柄池,reference中存储的是对象的句柄地址,句柄中包含了对象实例数据与类型数据各自的具体地址信息,reference中存储的是稳定的句柄地址;
**指针访问:**java堆对象的布局中必须考虑如何放置访问类型数据的相关信息,reference中存储的直接就是对象的地址。速度很快。
**

1. java的堆溢出
原因: java的堆是用来存储对象的实例,只要不断的创建对象,并且保证GC Roots到对象之间可达路径来避免垃圾回收机制清除这些对象,那么在达到最大堆容量的限制后就会产生内存溢出异常。
解决办法:常常java.lang.OutOfMemoryError会接着进一步提示“Java heap space。

2. java方法区和运行时常量池溢出
通过设置(-XX:PermSize-XX:MaxPermsize)限制方法区大小,从而间接限制常量池的容量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值