Java对象是怎么建立的(经过对象的建立,了解JVM内存结构)

在代码层面,咱们经过new关键字建立一个对象:html

Object obj=new Object();

而虚拟机中,建立一个对象,则通过了许多环节,JVM的内存结构能够经过另外一篇文章了解:一个“Hello World”理解JVM运行时数据区 ,本文主要基于JVM的内存结构,聊聊对象在JVM中是怎么建立的:安全

  1. 虚拟机遇到new指令,首先检查new的参数是否能在方法区中的常量池中定位到一个类的符号引用,而且检查这个类是否已被加载、解析和初始化过,若是没有,则先执行类加载机制;(先check是否须要load class,确保类已加载)
  2. 接着,虚拟机将为对象在堆(Java Heap)中分配一块内存,对象所需内存的大小在类加载(Class Load)完成后已经能够肯定。分配的方式主要有2种:指针碰撞(Bump the Pointer)和空闲列表(Free List)
  3. 分配完内存,虚拟机会对这些空间初始化为零值,这步操做保证了对象的实例字段在Java代码中能够不赋初始值就直接使用。
  4. 接着初始化对象头;对象头的信息包括:类的元数据信息、哈希码、GC分代年龄、是否启用偏向锁等
  5. 调用<init>方法

关键字词典:并发

指针碰撞:假设Java堆中的内存是规整的,全部已分配的内存都在一边,空闲的内存在另外一边,指针的位置在二者中间;当须要分配内存时,只须要将指针向空闲内存区域移动与对象大小相同的距离,这种分配方式叫作“指针碰撞”;Serial、ParNew等带Campact过程的收集器采用的就是指针碰撞;post

空闲列表:假设Java堆中的内存是不规整的,这些空闲的内存由一个表在维护,当须要分配内存给一个对象时,就会在这张表中查找一个足够的空闲空间出来分配给该对象,并更新记录。基于Mark-Sweep的CMS收集器就是使用空闲列表;spa

TLAB:内存的分配涉及了并发时线程安全的问题,所以每一个线程在Java堆中会预先分配一小块内存做为该线程的“本地缓冲区”(Thread Local Allocation Buffer),那个线程须要分配内存直接在该线程的TLAB上分配,只有TLAB用完须要分配新的TLAB时,才须要同步锁定内存。是否启用TLAB,能够经过-XX:+/-UseTLAB参数设定;第二、第3步都是在TLAB内完成。线程

相关文章
相关标签/搜索