对象的创建

2018-04-09  本文已影响56人  四喜汤圆

一、创建过程

对象创建过程.png

二、重点说明

1.在Java堆中为对象分配内存空间

分配方法

有两种主流方法:指针碰撞;空闲列表。

具体使用哪一种取决于堆是否规整,堆是否规整取决于JVM所采用的垃圾回收器是否具有压缩整理功能。

分配时的线程安全问题

解决方法:

  1. 分配内存空间的动作进行同步处理——实际上虚拟机采用CAS配上失败重试的方法
  2. 把内存分配的动作按照线程分配在不同的空间中进行(Thread Local Allocation Buffer,TLAB)。哪个线程要分配内存,就在线程的TLAB上分配,当TLAB用完重新分配时进行加锁。

2.虚拟机将分配到的内存空间(不包括对象头)都初始化为零值

对象的内存布局是:对象头,实例数据,对齐填充

  1. 对象头:1)存储对象自身运行时的数据(哈希码、GC分代年龄、锁标志等);2)类型指针,指向它的类元数据(通过该指针知道它是哪个类的实例)【该区域可无】
  2. 实例数据:就是类中声明的实例变量的值(无论是从父类继承下来的,还是在子类中定义的,都要记录下来
  3. 对齐填充:无实际意义。因为JVM要求对象占用的存储空间必须是8字节的整数倍,故通过对齐填充来补齐

3.<init>

由编译器自动收集类中所有实例变量 声明时赋的初值初始化块中赋的初值构造函数中赋的初值

上一篇下一篇

猜你喜欢

热点阅读