我们可以参考下JDK中反射的实现 , 也就是说当我们获取到一个Field对象就可以通过set()方法或者get()方法设置和读取某个属性的值 , 它首先要获取这个属性相对对象初始位置的偏移量 , 如果你持有这个对象的引用 , 你就能获取到这个对象在虚拟内存中的起始地址 , 然后我们根据属性的偏移量就可以获取这个属性的虚拟的内存地址 , 之后再查询页表就可以获取物理的内存的起始地址 , 接着再根据这个属性的类型取对应长度的数据 。
写入也是一样的道理 , 属性相对对象初始位置的偏移量在加载这个class的时候就确认好了 , 它是和class绑定的 , 那么如果一个对象就一个属性 , 如果不压缩的话那么除了对象头占128位 , 这个属性的偏移量可能就是128 , 如果有多个属性 , JVM会对属性进行重排序和内存对齐 , 保证对象占用的大小是8的倍数 , 另一个作用就是保证一个属性的值都在一个CPU的缓存行中 , 不然一个属性的值会一部分在缓存行A中一部分在缓存行B中 。
这期的分享到这里就结束了 , 希望这期的分享能帮助到你 , 欢迎在评论区给我留言 。
- 搜索引擎|淘宝运营系统出台春节打烊功能,淘宝运营商家该如何选择?
- |互联网运营是什么?快来看看你是哪种类型的运营
- 三星|三星手机Soc搭载AMD Radeon GPU曝光,运行频率超过苹果A15
- 运营商|5G套餐“出冷门”?人民日报“看不过”发文批评,运营商该反思了
- ubuntu|Ubuntu 22.04 降低硬件门槛,支持在 2GB 内存的树莓派 4 上运行
- iPhone13用户后悔?14全系列标配120Hz屏幕,可选8GB运行内存!
- javascript|Web前端培训:什么是 MEAN Stack?
- 官宣了!免费
- 运营商|手机六连靓号被运营商回收,拒绝补贴20万,运营商:浪费资源
- 10086APP停止运营?中国移动要“大义灭亲”还是自裁后路?