ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

深入理解JVM第三版笔记(5)-HotSpot虚拟机对象揭秘

2020-04-19 21:03:57  阅读:222  来源: 互联网

标签:对象 虚拟机 HotSpot 线程 内存 JVM 分配 空闲


HotSpot虚拟机对象揭秘

对象的创建

类是否加载

当Java虚拟机遇到一条new指令时,会先检查这个指令的参数是否能在常量池中定位到一个类的符号应用,并检查这个符号引用代表的类是否已经被加载,解析和初始化过.如果没有则会进行响应的类加载过程.

分配内存空间

虚拟机接下里为新生对象分配内存,所需内存的大小在类加载完成之后是完全确定的,为对象分配空间其实就是从内存中划分一块区域,有指针碰撞(Bump the Pointer)和空闲列表(Free List)两种方式.指针碰撞的实质是在一边为已用内存另一边为空闲内存的区域移动边界线,移动的距离就是对象所需的内存大小,它需要维护有序的两块内存.而当已用内存和空闲内存交错分布时,需要新的方式来维护内存分布信息,一般来说会采用空闲列表来记录内存中尚未使用的空闲内存.

使用Serial,ParNew等带压缩整理过程的收集器时会采用指针碰撞方法,既简单又高效;而当采用CMS这种基于清除(Sweep)算法的收集器时,理论上就只能采用空闲列表的方式.(在具体实现上,为了分配的更快,会使用Linear Allocation Buffer技术来分配缓冲区,使得局部有序,整体无序,通过空闲列表拿到一块分配缓冲之后,其中仍然采用指针碰撞的方式来分配.)

为对象分配内存是非常频繁的操作,仅仅修改指针指向的位置,在并发情况下是不安全的,解决这个问题有两种方案.

  1. 对内存分配空间动作采取同步处理,虚拟机使用CAS操作来保证原子性更新操作的原子性
  2. 另外一种是把内存分配的动作按线程划分在不同空间中进行,即每个线程在堆内预先分配一小块内存,称为本地线程分配缓冲(Thead Local Allocation Buffer,TLAB,预划分空间,增加分配操作的速度,但会降低内存空间的利用率),哪个线程需要分配内存,就在哪个线程的本地缓冲区分配,只有本地缓冲区用完了,分配新的缓冲区(真香,再来一块)时才需要同步锁定.虚拟机是否使用TLAB,可以通过-XX:+/-UseTLAB

初始化零值

内存分配完之后,虚拟机必须将分配到的空间(不包括对象头)初始化为零,如果使用了TLAB的话,这一项工作也可提前至TLAB分配前进行.这步操作保证了对象的实例字段在Java代码中不赋初值就可以直接使用,程序访问到对应类型的默认零值.

填充对象头

接下来,JVM还要对对象进行必要的设置,例如这个对象是哪个类的实例,如何才能找到类的元数据,对象的哈希码(会延迟到调用Object::hashCode()方法时计算),对象的GC分代年龄等信息.这些信息放在对象的对象头(Object Header)中,根据虚拟机的不同,例如是否启用偏向锁等,还会有不同的设置方式.

执行<init>()方法

上述工作完成后,从虚拟机的角度看,一个新的对象已经产生了,但是从Java程序的角度看,对象创建才刚刚开始--构造函数,即Class文件中的<init>()方法还没有执行,字段还都是默认的零值,对象需要的其他资源和状态信息也没有按照预定的意图构造好.一般来说new指令之后会执行<init>()方法(由字节码流中new指令后是否跟随invokespecial指令决定,JVM在遇到new关键字后会产生这两个指令,但直接通过其他方式生成的则不一定如此),按照程序员的意愿对对象进行初始化,这样一个真正可用的对象才被构造出来.

标签:对象,虚拟机,HotSpot,线程,内存,JVM,分配,空闲
来源: https://www.cnblogs.com/SheezyGuo/p/12733471.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有