Java 对象的创建过程
Posted yishanchuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 对象的创建过程相关的知识,希望对你有一定的参考价值。
引言
重点讲讲普通的对象、数组对象以及class对象的创建过程。
对象通常由三个部分组成:对象头、实例数据喝对齐填充。
1. 普通对象创建过程
- 类加载
- 分配内存
- 初始化
- 设置对象头
- 执行init方法
1.1 类加载
JVM遇到new 关键字时,会去常量池中查看有无该类的符号引用,并检查其是否加载、解析和初始化。如果有则,进行下一步分配内存,否则执行类加载机制。
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构。
详细过程:加载-连接-初始化-使用-卸载
new指令对应语言层面上,对象克隆、对象序列化
1.2 分配内存
对象所需内存大小根据加载的类来确定,为对象分配内存也就是在堆内存中分配一块确定大小的内存。
这里有两个点需要注意:
- 内存划分方式
- 指针碰撞
- 空闲列表
- 并发内存分配带来的混乱
- CAS比较与交换
- TLAB本地线程分配缓冲
1.3 初始化
JVM初始化分配好的内存,将其设为零值,注意不包括对象头。如果使用了TLAB,这一步可以提前到内存分配阶段进行。
1.4 设置对象头
对象头包含两部分信息。第一部分是用于存储对象自身的运行时数据,如hashcode、GC分代年龄、锁状态标志、线程持有的锁等;第二部分是类型指针,指向它对应的类元数据,VM用这个确定其属于哪个类的实例。
1.5 执行init方法
主要是对属性赋值,执行构造函数。
参考文献
【1】Java 对象结构:https://www.cnblogs.com/maxigang/p/9040088.html
以上是关于Java 对象的创建过程的主要内容,如果未能解决你的问题,请参考以下文章
JVM技术专题 全流程化分析Java对象的创建过程「 原理篇」