对象

一、类的创建

  1、new 类名

  2、根据new的参数在常量池中定位一个类的符号引用

  3、如果没有找到这个类的符号引用,则说明这个类还没有被加载,则进行类的加载,解析和初始化

  4、java虚拟机为对象分配内存(位于堆内存中)

  5、将对象内存初始化为零值(不包括对象头)

  6、调用对象的init方法

二、为对象分配内存

  指针碰撞

  空闲列表

三、线程安全性问题

  线程同步(加锁):执行效率低

  本地线程分配缓冲:为每个线程分配属于自己的内存区域

四、初始化对象

五、执行初始化方法

  对象初始化过程详解:https://www.cnblogs.com/haoyujun135/p/11328491.html

六、对象的结构

  Header(对象头)

    自身运行时数据(Mark Word)

      哈希值(GC分代年龄)

      锁状态标志

      线程持有的锁

      偏向线程ID

      偏向时间戳

 

 

 HotSpot虚拟机对象头Mark Word

    类型指针:对象指向类的源数据的指针(到对象实例数据的指针与到对象类型数据的指针)

  InstanceData:HotSpot(相同宽度字段分配在一起)

  Padding:填充内存的作用,(HotSpot)虚拟机要求对象所占内存必须为8位的整数倍,不满足时同步Padding进行填充

七、对象的访问定位

  使用句柄:先访问句柄池,由句柄池调用堆内存(栈中访问内存统一)

  直接指针:直接调用堆内存(节省性能开销)

posted @ 2019-12-25 09:43  七月流星丶  阅读(103)  评论(0编辑  收藏  举报