2、JVM-Java对象的创建、对象结构、对象访问定位 - Go语言中文社区

2、JVM-Java对象的创建、对象结构、对象访问定位


目录

给对象分配内存(两种)

对象结构

对象的访问定位


 


记录下来方便个人学习复习

 

 

 

  • 注:根据new的参数在常量池中定位一个类的符号引用 --这句话的意思是:常量池相当于c语言中的指针地址集合,所以就是在常量池中保存new对象的地址,通过地址定位对象在堆中的位置

  • 给对象分配内存(两种)

    • 指针碰撞的方式(内存比较规整的情况下)

 

  • 空闲列表的方式(内存不规整的情况下)

 

内存是否规整取决于垃圾回收器的策略,当垃圾回收时压缩整理了内存,在内存分配时就是使用内存碰撞的方式

  • 线程安全性问题

    • 线程同步

    • 本地线程分配缓冲

      • 多线程的情况下对象在分配内存的过程中会出现线程安全的问题,所以当每个一线程进来的时候虚拟机都会为每一个线程分配一块独立的内存空间,称之为本地线程分配缓冲


对象结构

  • Header(对象头)

    • 自身运行时数据(Mark Word)

      • 哈希值、GC分代年龄、锁状态标志、线程持有的锁、偏向线程id、偏向时间戳

    • 类型指针

  • InstanceData(实例数据)

  • Padding(队形填充)

    • 对象的创建有指定的大小,比如int类型4个字节,如果数据没有4个字节,现在就需要使用padding填充对象到4个字节


对象的访问定位

  • 句柄

    • 堆中的句柄池保存着堆中对象的实例指针(和对象类型数据的指针,这个指针指向方法区),栈中的对象引用指向这个句柄池,句柄池中的对象指针指向对象实例。所有句柄也叫指针的指针

  • 直接指针

    • 栈中对象的引用直接指向堆中的对象实例(直接指针也保存着对象实例指针和对象数据类型指针)

句柄需要先指向句柄池找到对象实例的地址,再找到对象的实例,需要2步,直接指针直接指向对象的实例,需要1步即可。那么为什么还会有句柄的方式,因为如果对象发生改变(为什么会改变?因为gc算法,当复制或者整理的时候对象实例会移动在堆中的地址)栈中指向句柄池的地址不需要改变,改变的都是句柄池中的地址(句柄池和对象实例都是在堆中,所以在改变句柄池的实例指针就比改变栈中的应用指针方便)。使用直接指针的方式比句柄的方式快,Hotspot使用的是直接指针的方式

 

                                                                                      注:博文内容来自书本《深入理解Java虚拟机》第2版 周志明著

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/a1053765496/article/details/94839799
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-08 17:21:54
  • 阅读 ( 918 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢