对象的创建过程
这里所说的是普通的对象(不包括数组、Class对象等)
- 当虚拟机遇到new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过,如果没有,那必须先执行相应的类加载过程。
- 类加载检查通过后,接下来就是为这个对象分配内存,对象所需内存的大小在类加载完成后便可以确定,就是从java堆内存中划出一块空间给这个对象使用,需要注意在分配内存时的线程安全问题。
- 内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值。
对象的内存布局
对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)
- 对象头包括两部分数据:第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等;第二部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
- 实例数据部分存储的是对象真正的有效信息,也是在程序代码中所定义的各种类型的字段内容(所以类的成员变量是在这部分内存中存储的,方法中的局部变量是在栈中存储的,而常量、静态变量是在方法区中存储的),无论是从父类继承下来的还是在子类中定义的,都需要记录下来。
网友评论