JVM 之 对象

目录

对象创建过程

 分配方式

线程安全

初始化

执行init方法

对象结构

1.Header(对象头)

2.instanceData(存储对象有效信息)

3.padding(占位符。Hotspot规定对象大小必须是8字节整数倍)

对象的访问定位


对象创建过程

  1. new 类名
  2. 根据new的参数在常量池中定位一个类的符号引用
  3. 如果没有找到这个符号引用,说明类没有加载,则进行类的加载,解析和初始化
  4. 虚拟机为对象分配内存(在Java堆中)
  5. 将分配的内存初始化为零值(不包括对象头)
  6. 调用对象的init方法

 分配方式

  1. 指针碰撞
    假设Java堆中内存是完整的,已分配的内存和空闲内存分别在不同的一侧,通过一个指针作为分界点,需要分配内存时,仅仅需要把指针往空闲的一端移动与对象大小相等的距离。使用的GC收集器:Serial、ParNew,适用堆内存规整(即没有内存碎片)的情况下。
  2. 空闲链表

    事实上,Java堆的内存并不是完整的,已分配的内存和空闲内存相互交错,JVM通过维护一个空闲列表,记录可用的内存块信息,当分配操作发生时,从列表中找到一个足够大的内存块分配给对象实例,并更新列表上的记录。使用的GC收集器:CMS,适用堆内存不规整的情况下。

    Java 堆内存是否规整,取决于 GC 收集器的算法是”标记-清除”,还是”标记-整理”(也称作”标记-压缩”),值得注意的是,复制算法内存也是规整的。在使用Serial、ParNew等待整理过程的收集器时,采用的是指针碰撞,在使用CMS这种mark-sweep算法的收集器时,使用的是空闲列表

由垃圾收回器决定分配方式(收集器是否支持压缩整理功能)。即分配方式有 “指针碰撞” 和 “空闲列表” 两种,选择那种分配方式由 Java 堆是否规整决定,而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。
 

线程安全

解决方法:

1.同步线程
2.给线程分配自己的内存独占区(本地线程分配缓冲)

具体如下:

  • CAS+失败重试: CAS 是乐观锁的一种实现方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。虚拟机采用 CAS 配上失败重试的方式保证更新操作的原子性。
  • TLAB: 为每一个线程预先在 Eden 区分配一块内存。JVM 在给线程中的对象分配内存时,首先在各个线程的TLAB 分配,当对象大于TLAB 中的剩余内存或 TLAB 的内存已用尽时,再采用上述的 CAS 进行内存分配。虚拟机是否启用TLAB,可以通过-XX:+/-UseTLAB参数来设定。

初始化

抽象数据类型为null,基本数据类型为0。填写对象头

执行init方法

在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了,但从 Java 程序的视角来看,对象创建才刚开始,<init> 方法还没有执行,所有的字段都还为零。所以一般来说,执行 new 指令之后会接着执行 <init> 方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全产生出来。

对象结构

1.Header(对象头)

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

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

  •     类型指针


2.instanceData(存储对象有效信息)


3.padding(占位符。Hotspot规定对象大小必须是8字节整数倍)

对象的访问定位

1.使用句柄(间接):如果使用句柄池的话,java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息

2.直接指针(直接,Hotspot采用这种):如果使用直接指针,那么Java堆中的对象的布局就必须考虑如何放置访问类型数据的相关信息,而reference中存储的就是对象的直接地址

使用句柄访问最大的好处就是reference中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而reference本身不需要修改。
使用直接指针最大的好处就是速度更快,节省了一次指针定位的时间开销。

具体由虚拟机决定使用哪种方式。

本文参考:

https://www.cnblogs.com/aiqiqi/p/10770864.html

在此对作者表示感谢

发布了155 篇原创文章 · 获赞 11 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u013919153/article/details/105111100