对象在内存的创建,定位,内存分配
电话面试
对象创建
P44
new指令,参数是否在常量中定位到一个类的符号引用,是否已加载解析初始化,分配内存堆空间,内存初始化为零值,设置对象布局,执行方法
设置对象布局:
对象头(运行时数据:GC分代年龄,持有的锁,哈希码;类型指针:指向类元数据指针,确定是属于哪个类的实例),实例数据(字段内容),对齐填充
对象的访问定位
- 句柄:堆中画出内存作为句柄池,Java栈局部变量表中的refernce存放的就是对象的句柄地址,句柄包含对象实例数据(堆)与对象类型数据(方法区:常量,静态变量)的具体地址信息
对象被移动只需改变句柄池的指针,reference本身不用系应该
- 指针:java堆对象的布局考虑如何放置访问类型数据的相关信息,refernce存储的是对象地址
HotSpot 速度快
P49
对象内存分配
- 对象优先分配在Eden:没有足够分配时,Minor GC 速度快,频繁,老年代FullGC 慢很多
- 大对象直接进入老年代:很长的字符串和数组
- 长期存活的对象进入老年代:每个对象定义了对象年龄计数器,通过一次Minor GC +1,默认到15进入老年代
动态对象年龄担保:如果Survivor空间相同年龄的所有对象大小总和大于空间的一半,年龄大于等于改年龄的对象直接进入老年代
- 空间分配担保:M GC前,检查老年代最大连续可用空间十分大于新生代所有对象总空间,如成立,Minor GC是安全的。不成立的虚拟机查看HandlePromotionFailire设置值是否允许担保失败,允许的检查老年代最大连续可用空间是否大于历次晋升到老年代对象的平均大小,如果大于,再进行一次M GC ,有风险,如小于或者不允许,将进行一次F GC