深入理解JAVA虚拟机—第二章java内存区域与内存溢出异常(二)HotSpot探秘

因为每种JVM的实现细节不同,目前JDK默认的是HotSpot,所以通过探究HotSpot来探索Java堆中对象分配,布局和访问的全过程。

  1. 对象的创建
    1. 当JVM遇到一条new指令时,首先会在运行时常量池中查找是否有这个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。
    2. 在类加载检查通过后,JVM会为这个新生的对象分配内存空间,对象所需的内存大小在类加载完成后便可以确定了,给对象分配内存的过程,其实就是在JVM管理的内存中找一块确定大小的内存划分出来
      1. 当JVM内存比较规整时,这取决于GC使用复制算法还是清除算法了,如果规整的情况下,那么JVM中内存分成两部分一部分是已经分配的,一部分没有分配。有一个指针指向了这个临界点的位置,那么每次分配空间时,这需要将指针朝着未分配的区域移动等同于新对象大小的长度就可以了,这种方法叫做指针碰撞(Bump the Pointer)
      2. 当JVM内存比较杂乱的时候,就无法使用指针碰撞的方法来分配内存了,这个时候JVM一般会通过空闲列表(Free List)通过列表记录每块内存中是否使用。在创建新对象的时候通过从FreeList中取出一块足够大的内存区域存放这个新的对象
      3. 除了划分区域的问题之外,还需要解决线程安全的问题,假设当线程A请求内存区域,分配完成后,指针没有调整或者空闲列表没有更新的时候,线程B也请求内存区域,解决这个问题的方法,通过给每个线程分配自己的内存区域称作本地线程缓冲(Thread Local Allocation Buffer,TLAB)。当TLAB用完需要划分新的TLAB的时候对内存区域同步锁定。另外一种方法就是在每次分配内存区域的时候进行同步锁定,开启TLAB可以通过(-XX+/-UseTLAB)开启。
    3.  内存分配完成后,虚拟机需要将分配到的内存空间设置为0(不包括对象头),也可以在分配TLAB的时候就设置为0,这样进一步保证了JAVA代码中的对象可以不设置初始值就可以使用。
    4. 接下来还会设置对相头(Object Header)。设置过对象头之后,从虚拟机的角度,对象已经产生了,紧接着new指令后面会有一条init指令,因为目前所有的值都为0,init指令会将对象按照程序猿的意愿初始化。这样一个对象才算创建完成。
  2. 对象的内存布局
    1. 在HotSpot中,对象在内存中分为3部分,对象头、实例数据(Instance Data)和对齐填充(Padding)。
      1. 对象头放在以后研究
      2. 实例数据,主要是定义的各种真正的有效信息,也就是在程序中定义的各种类型的字段内容,根据JVM分配策略,HotSpot中是将相同宽度的字段分配在一起,默认情况下满足上述条件之后父类的变量还会在子类之前。
      3. 对齐填充,并不是一定会存在,由于HotSpot处理对象的启示地址必须是8字节的整数,同时对象头固定长度32位或者64位。所以当实例部分不是对齐的时候,则需要通过对齐补充来达到对齐的效果。
  3. 对象的访问定位
    1. 创建对象是为了操作对象,我们的JAVA程序需要通过栈上的reference数据来操作堆上的具体对象。由于reference在JVM中只规定了指向一个对象的引用,并没有定义引用应该通过何种方式去定位、访问堆中的对象的具体位置。所以目前reference访问对象方式取决于虚拟机具体的实现,目前主要分为两种:
      1. 句柄:在Heap上分配了一个句柄池区域,reference指向这个句柄,句柄中指向真实对象在内存中的地址,同时指向方法区中的对象类型信息。详细情况如下:《深入理解JAVA虚拟机—第二章java内存区域与内存溢出异常(二)HotSpot探秘》
      2. 直接指针访问:reference直接指向Heap中的实例对象,对象中保存着方法区中对象类型数据的指针地址《深入理解JAVA虚拟机—第二章java内存区域与内存溢出异常(二)HotSpot探秘》
      3. 两种访问方式的区别:使用句柄最大的好处是reference比较稳定,当对象被移动后,只会改变句柄中的实例指针地址,reference,使用直接指针访问方式,最大的优势就是速度更快,每次访问节省了一次指针定位的时间开销,对象在java中频繁访问的情况下,这种减少开销是非常可观的。HotSpot中就是使用直接指针访问对象。

 

    原文作者:java虚拟机
    原文地址: https://blog.csdn.net/qq_16550909/article/details/81303393
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注