jvm(三):对象

  关于对象,我们需要面对的问题主要有对象的创建,对象在内存中的布局,对象的结构,对象的访问定位。

  对象的创建

  对象的创建过程如下图所示:

  其主要步骤有:给对象分配内存,初始化对象,执行构造方法。

  在对象创建过程中出现的线程安全性问题由线程同步和本地线程分配缓冲来解决

  对象在内存中的布局

  a、指针碰撞

  b、空闲列表

  对象内存的分配方式由堆内存是否规整决定,堆内存是否规整又有垃圾回收策略决定。如果堆内存规整则采用指针碰撞方式分配内存资源,如果堆内存不规整则采用空闲列表方式分配内存。

  对象的结构

  对象由三部分组成:

  自身运行时数据(Mark Word)包含哈希值,GC分带年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等

  类型指针:指向类的元数据的指针,记录对象的类型(并不是都存在)

  对象的访问定位

  对象的访问定位有两种方式:

  a、直接指针

  栈内存的引用直接指向堆内存的引用,优点:简单,减少了寻址的次数,性能比较高

  b、使用句柄

  栈内存的一个引用,指向堆内存的句柄池,由句柄池指向对象,优点:栈内存的引用不用发生变化,变得只是句柄池中指向对象的地址。

   其实关于类的一些信息是存储在方法区中的,也就是说,如果是直接指针方式的话,堆中的对象还有一个指向方法区的引用。如果是句柄方式的话,句柄池中还要包含一个指向方法区的引用。

  

原文地址:https://www.cnblogs.com/sbrn/p/8931119.html