java 内存偏移量_如何计算静态变量的内存地址相对其Class对象内存地址的偏移量呢...

我在一篇文章中看到这么一段话,我想验证一下

99cd211cbde2

99cd211cbde2

对于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社区

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值