JVM中的对象
对象的分配
检查加载:先执行相应类的加载过程
分配内存:根据方法区的信息确定为该类分配的内存空间大小
指针碰撞(java堆内存空间规整的情况下使用)
空闲列表(java堆空间不规整的情况下使用)
上面两点存在的问题:
并发安全
解决:cas操作,分配缓存
内存空间初始化:虚拟机需要把分配到的内存空间都初始化为零值(int 为0 boolean 为false)
设置:虚拟机要对对象进行必要的设置,如,类的元数据信息,对象的hash码,对象的GC分代年龄信息
对象实例化:上面的工作完成之后,一个对象才真正的实例化
对象的内存布局:
对象头(Header):1.存储对象自身运行的数据,GC标志,对象分代年龄 2.类型指针
数据实例:
对齐填充:JVM要求对象的大小必须是8字节的整数倍,否则进行填充
对象的访问定位:
通过栈上的reference数据来操作堆上的数据,有两种,使用句柄,直接使用指针
句柄:java堆中将会划分一块内存来最为句柄池,reference中存储的就是对象的句柄地址
直接使用指针:reference中存储的就是对象地址
对于HotSpot来说,它是直接使用指针访问的
堆内存的分配策略:
新生代:
Eden区,Survivor(from)区,Survivor(to)区,默认比例是8:1:1
Eden区没有足够的空间时,虚拟机将发起一次MinorGC
对象优先在Eden区
大对象直接进入老年代:
上期存活对象进入老年区:存活年龄到达15的时候进入老年区
对象年龄动态判定:在Survivor中,相同年龄大小综合大于Survivor空间的一半,提前进入老年代
空间分配担保:HotSpot默认是开启的