对象实列化
java是面向对象的静态强类型语言, 声明并创建对象的代码很常见, 根据某个类声明一个引用变量指向被创建的对象, 并使用此引用变量操作该对象
那么在实列化对象的过程中, JVM中发生了什么化学反应呢?
(1) 下面从最简单的Object ref = new Object(), 代码进行分析, 利用javap-verbose-p命令查看对象创建的字节码如下:
stack=2, locals=1, args_size=0
NEW java/lang/Object
DUP
INVOKESPECIAL java/lang/Object.<init>()v
ASTORE_1
LocalVariableTable:
Start Length Slot Name Signature
8 1 0 ref Ljava/lang/Object;
- NEW: 如果找不到Class对象, 则进行类加载, 加载成功后, 则在堆中分配内存,从Object开始到本类路径上的所有属性值都要分配内存, 分配完毕之后, 进行零值初始化, 在分配过程中, 注意引用是占据存储空间的, 它是一个变量, 占用4个字节, 这个指令完毕后, 将指向实列对象的引用变量压入虚拟机栈顶
- DUP: 在栈顶复制该引用变量, 这时的栈顶有两个指向堆内实列对象的引用变量, 如果(init)方法有参数, 还需要把参数压入操作栈中, 两个引用变量的目的不同, 其中压至底下的引用用于赋值, 或者保存到局部变量表, 另一个栈顶的引用变量作为句柄调用相关方法
- INVOKESPECIAL: 调用对象实列方法, 通过栈顶的引用变量调用(init