第二部分自动内存管理
第二章Java内存管理和内存溢出异常----对象创建和对象布局
这部分有:1 对象创建, 2对象布局
1.对象创建
步骤1:创建对象(也就是new)-----> 内存分配 -----> 内存分配方式 : 1. 有序分配(指针碰撞)
| 2. 无须分配(空闲列表)
垃圾回收器会决定内存分配方式
步骤2:当分配内存是需要考虑的事情 频繁多次创建对象:解决方案 1 同步处理 : CAS + 失败重试 =保证其原子形。
2 本地线程缓冲分配: 线程会优先使用本地缓存,之后会在分配本地缓存。
步骤3:以上步骤完成以后,虚拟机必须对分配好的内存空间进行初始化为零值。
步骤4:会把一些信息设置到对象头中。如某个对象是哪一个类,如何找到类的元数据,对象的哈希值,对象的GC的分代年龄等等。
2.对象布局
对象布局分为三部分 1 对象头: 1)第一 ”mark word“ ------ 这是一个用于存储对象运行时的数据信息。
2)第二 指针类型 ------ 这是用于识别该对象时属于哪一个类的实例,如果对象是数组的时候,我们应该找一块内存来记录数组长度。
2 实例数据: 这个是用来存放有效信息,也就是代码中定义好的各种类型的字段信息,还有就是子类从父类中继承到的数据,这些数据在存储的顺序会受到虚拟机分配策略参数和字段在代码中定义的位置受到影响
3 对齐填充: 仅仅作为占位符没有实际意义(可有可无)。
3.定位对象
对象创建 ----> 使用对象 ----> reference数据来操作堆中数据(reference类型只是指向对象的引用)。
reference访问数据的方式:1)句柄 :使用句柄方式,Java堆中可能就会划分出一个句柄池,reference就会存储对象的句柄地址,而句柄吃就会存储关于实例对象信息和对象类型信息的地址信息。
优势:存储在稳定的句柄地址,若有变动只需变动句柄中实例数据指针即可。
2)直接指针:使用直接指针,就会指向存储实例对象有效数据和对象类型的地址信息,这样就会减少访问对象的有效数据的地址信息。
优势:读取数据速度快,节省指针定位的时间成本(在Java中访问对象十分频繁)。
祝大家国庆快乐和中秋快乐
未完待续