Java|Java代码运行的过程是怎样的?( 三 )



我们可以参考下JDK中反射的实现 , 也就是说当我们获取到一个Field对象就可以通过set()方法或者get()方法设置和读取某个属性的值 , 它首先要获取这个属性相对对象初始位置的偏移量 , 如果你持有这个对象的引用 , 你就能获取到这个对象在虚拟内存中的起始地址 , 然后我们根据属性的偏移量就可以获取这个属性的虚拟的内存地址 , 之后再查询页表就可以获取物理的内存的起始地址 , 接着再根据这个属性的类型取对应长度的数据 。

写入也是一样的道理 , 属性相对对象初始位置的偏移量在加载这个class的时候就确认好了 , 它是和class绑定的 , 那么如果一个对象就一个属性 , 如果不压缩的话那么除了对象头占128位 , 这个属性的偏移量可能就是128 , 如果有多个属性 , JVM会对属性进行重排序和内存对齐 , 保证对象占用的大小是8的倍数 , 另一个作用就是保证一个属性的值都在一个CPU的缓存行中 , 不然一个属性的值会一部分在缓存行A中一部分在缓存行B中 。
这期的分享到这里就结束了 , 希望这期的分享能帮助到你 , 欢迎在评论区给我留言 。