我在一篇文章中看到这么一段话,我想验证一下
对于HotSpot VM的对象模型,静态字段的“偏移量”就是:
JDK 6或之前:相对该类对应的InstanceKlass(实际上是包装InstanceKlass的klassOopDesc)对象起始位置的偏移量
JDK 7或之后:相对该类对应的java.lang.Class对象起始位置的偏移量。
希望大大们能帮忙解答,感激不尽
回复 1:
[你假笨]:JDK6 一开始是计算是相对于 instanceKlass 的,大概逻辑如下:
next_static_oop_offset = (instanceKlass::header_size() +
align_object_offset(vtable_size) +
align_object_offset(itable_size)) * wordSize;
JDK6后面某个版本有了Mirror的结构,才开始相对Class对象了
staticvoidinit_offset_of_static_fields(){// Cache the offset of the static fields in the Class instanceassert(_offset_of_static_fields ==0,"once"); _offset_of_static_fields = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->size_helper() << LogHeapWordSize; }
上面之所以有一些大小差异,是因为java.lang.Class对象本身就有一定大小,并且有一些实例字段,占了一部分
[难得今生共此时]:那 Class 对象是存在堆中的吗?假大知道上面那个偏移量 160 是怎么算的吗
[你假笨]:嗯,是的。主要看 Class 类里的实例属性有多少,算出来后再加一个开头的偏移量 12
欢迎关注微信公众号:PerfMa社区