一马平川
不积跬步无以至千里,后继才能薄发

JVM HotSpot对象创建过程笔记

2021年07月24日
0
未分类
未设置标签

JVM HotSpot对象创建

创建方式

  • new关键字

  • clone():需要实现Cloneable接口

  • 反序列化:需要实现Serializable 接口

  • 反射

    • Class.newInstance()方法
    • Class.getConstructors()方法
  • Unsafe(sun.misc.Unsafe):不需要调用其构造函数、初始化代码、JVM安全检查等

    • allocateInstance()方法

    应用场景:

    • java.lang.invoke
    • Gson的反序列化
    • Objenesis

创建过程

  1. 在常量池定位这个类的符号引用,符号引用代表的类是否被加载、解析、初始化过。若没有,则执行对应的类加载过程

  2. 确定对象所需内存,对象所需的内存在类加载完成后就能确定

  3. 分配内存

    其中内存分配方法分为两种:

    1. 指针碰撞(Bump the Point):这个方法只有在GC算法有压缩整理功能才能使用,Java堆通过一个指针作为已使用内存和空闲内存的界限,分配内存就是把指针挪动需要的大小的距离
    2. 空闲列表(Free List):通过把空闲的内存块通过列表记录起来,需要分配是在里面找到足够大的连续空间划分给对象实例
  4. 内存初始化为零值

    这个步骤若使用TLAB,则在TLAB分配时进行,具体是将数据类型设为对应的零值,如int的0,boolean的false

  5. 设置实例(markword)

    1. 对象是哪个类的实例
    2. 类的元数据信息引用
    3. 对象的Hash Code:这个会在调用Object::hashCode()方法才会计算
    4. GC分代信息
  6. 方法初始化(构造函数)

如果喜欢这篇文章,可以给作者评个份哦~

原文声明: "转载本站文章请注明作者和出处Nothinglin ,请勿用于任何商业用途"

公众号:苦逼的学生仔