我们可以参考下JDK中反射的实现 , 也就是说当我们获取到一个Field对象就可以通过set()方法或者get()方法设置和读取某个属性的值 , 它首先要获取这个属性相对对象初始位置的偏移量 , 如果你持有这个对象的引用 , 你就能获取到这个对象在虚拟内存中的起始地址 , 然后我们根据属性的偏移量就可以获取这个属性的虚拟的内存地址 , 之后再查询页表就可以获取物理的内存的起始地址 , 接着再根据这个属性的类型取对应长度的数据 。
写入也是一样的道理 , 属性相对对象初始位置的偏移量在加载这个class的时候就确认好了 , 它是和class绑定的 , 那么如果一个对象就一个属性 , 如果不压缩的话那么除了对象头占128位 , 这个属性的偏移量可能就是128 , 如果有多个属性 , JVM会对属性进行重排序和内存对齐 , 保证对象占用的大小是8的倍数 , 另一个作用就是保证一个属性的值都在一个CPU的缓存行中 , 不然一个属性的值会一部分在缓存行A中一部分在缓存行B中 。
这期的分享到这里就结束了 , 希望这期的分享能帮助到你 , 欢迎在评论区给我留言 。
- 创投圈|抖音小店无货源适合新手小白么?如何精细化运营?新手小白看来
- 物体做曲线运动时法向加速度有可能为0吗?
- 第四大运营商|第四大运营商登场!中国广电官网上线:开启选号
- 谷歌警告运营商小心Hermit间谍软件
- 无人驾驶|189元Ticwatch GTK智能手表上手评测:颜值、运动、电量集一身,香
- 189元Ticwatch GTK智能手表上手评测:颜值、运动、电量集一身,香
- 华为|华为又拿下中国电信一5G大单 还是国内三大运营商大方
- Java|干翻小米,红米又出超大杯旗舰,120W+2K直屏+双旗舰芯
- 百度地图|Java程序员应知应会之Maven和Gradle的区别
- javascript|穿戴设备将迎变革,OPPO又增新专利,能提升模式切换效率!
