java对象的内存布局
在Hotspot虚拟机中,对象在内存中存储布局可以分为三个区域:对象头、实例数据、对齐填充。
对象头:分为两部分,一部分存储对象自身运行时数据,如哈希码、GC分代年龄、线程持有锁等;另外一部份存储类型指针,即对象指向它的类元数的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
* java对象的访问定位*
目前主流的访问方式有使用句柄和直接指针两种。
**句柄:**java堆中会划分一块内存用来作为句柄池,reference中存储的是对象的句柄地址,句柄中包含了对象实例数据与类型数据各自的具体地址信息,reference中存储的是稳定的句柄地址;
**指针访问:**java堆对象的布局中必须考虑如何放置访问类型数据的相关信息,reference中存储的直接就是对象的地址。速度很快。
**
1. java的堆溢出
原因: java的堆是用来存储对象的实例,只要不断的创建对象,并且保证GC Roots到对象之间可达路径来避免垃圾回收机制清除这些对象,那么在达到最大堆容量的限制后就会产生内存溢出异常。
解决办法:常常java.lang.OutOfMemoryError会接着进一步提示“Java heap space。
- 内存泄漏:产生原因和解决办法
- 内存溢出:检查虚拟的堆参数(
-Xmx
与--Xms
),可以尝试把值调大
2. java方法区和运行时常量池溢出
通过设置(-XX:PermSize
与-XX:MaxPermsize
)限制方法区大小,从而间接限制常量池的容量