首页 > 编程语言 >Java - 对象的创建过程

Java - 对象的创建过程

时间:2022-10-28 12:06:28浏览次数:51  
标签:Java 对象 创建 分配内存 内存 GC 空闲 指针


Java 对象的创建过程(new 的过程)


  1. 在静态常量池中找到对应类的符号引用,检查该类是否被加载、解析,初始化(判断类是否加载);
  2. 加载后,分配内存(指针碰撞 或者 空闲链表);
  3. 零化内存空间;
  4. 设置对象头(分代年龄,类型指针等);
  5. <init> 方法;

对象在内存中存储的布局


  • 对象头;

1. MarkWord:对象自身运行时数据,比如:hashcode,GC 分代年龄,锁状态信息等



2. 类型指针:指向类元数据的指针



  • 实例数据:有效值
  • 对齐填充:占位符

对象的定位访问


  • 句柄访问


Java - 对象的创建过程_加载



  • 直接指针访问


Java - 对象的创建过程_加载_02



对象内存分配方法


1. 指针碰撞:


适用于内存整齐的情况[ GC 算法:标记-整理 compact][ 新生代],已使用在一边,未使用在一边,分配内存既是指针移动。


2. 空闲列表:


已分配与未分配内存相互交错[ GC 算法:标记-清理 sweep][ 老年代],用链表记录空闲内存块,根据空闲列表分配内存。




标签:Java,对象,创建,分配内存,内存,GC,空闲,指针
From: https://blog.51cto.com/u_11290086/5804044

相关文章

  • Java - 线程同步方式
    概念同步异步消息通信机制同步:发出调用之后,在没有得到结果之前,该调用不返回。调用者主动等待调用结果。异步:发出调用之后,该调用直接返回,无结果。被调用者通过状态、通......
  • Java - 重载 与 重写 的区别
    静态分派与动态分派1.静态类型[外观类型]=>方法执行版本=>编译期确定2.实际类型=>方法执行版本=>运行期确定静态解析与动态连接1.静态解析:符号引用(c......
  • Java - 类加载机制
    加载=>验证、准备、解析(链接)=>初始化类初始化时机1. 遇到new,getstatic,putstatic,invokestatic这四条字节码指令时,如果类没有进行过初始化,需要进行初始化......
  • Java - synchronized 和 volatile
    1.两者均可以实现可见性(线程B可以读到线程A更新的最新值)2.volatile本质就是告诉JVM,当前变量在寄存器中的值不确定,需要从主存中读取。synchronized锁定了当前变量,只有......
  • Java - Java 中的四种引用
    强引用Objecto=newObject();只要强引用还存在,垃圾回收器就永远不会回收掉该对象。软引用描述有用但是非必需的对象,使用softReference类来实现是否回收对象取决于J......
  • Java - 垃圾回收算法与垃圾回收器
    垃圾回收算法1.标记-清除过程:标记所有需要回收的对象,标记结束后,回收所有被标记的对象缺点:效率低下,容易造成碎片2.复制将内存空间分为两部分,每次只使用一部分,当一部分用......
  • Java - 简单可达性分析
    可以作为GCRoot的对象1.方法区中常量引用的对象2.方法区中静态属性引用的对象3.虚拟机栈中引用的对象4.本地方法栈中引用的对象可达性分析通过GC......
  • Java - <clinit> 与 <init>
    1..java=>编译=>.class=><clinit>=>类构造器2.类构造器将静态变量(初始化)和静态语句块收敛(将一系列操作集合起来执行)到<clinit>收敛顺序:父类静态变量......
  • Java - 简述JVM 内存模型
    JVM[来源:维基百科]程序计数器程序计数器是当前线程执行的字节码的行号指示器;程序计数器线程私有;程序计数器是JVM规范中唯一一个没有任何OutOfMemoryError的区域;虚......
  • Java - 创建子类实例时要先创建父类实例
    1.会访问方法区中父类的元数据2.会在堆内存中为父类分配空间,用来存储父类实例属性3.但是,这块堆内存属于子类所有......