01-对象的生命周期
-
对象创建的流程:
- 常量池检查
- 分配内存空间
- 初始化零值
- 设置对象头内元数据信息
-
内存分配方式:
- 指针碰撞(Bump the Pointer)
- 空闲列表(Free List)
-
内存分配安全性问题及解决方案:
- 本地线程分配缓冲TLAB
- 乐观锁CAS
-
新对象大多数默认进入新生代的Eden区
-
对象何时进入老年代,主要有四种情况:
- 存活年龄太大,默认超过15次
- 动态年龄判断
- 大对象直接进入老年代
- MinorGC后存活对象太多无法放入Survivor
-
空间担保机制:当新生代无法分配内存时,将新生代的老对象转移到老年代,然后将新对象放入腾空的新生代。
02-对象内存布局
- 对象内存布局包括三个区域:
- 对象头(Header):对象头占8字节,数组则占12字节,包含标记字段MarkWord、类型指针KlassPoint、数组长度和对齐填充。
- 实例数据(Instance Data):生成对象时,对象的非静态成员变量也会存入堆空间。
- 对齐填充(Padding):JVM对象采用8字节对齐,不足8字节的会自动补齐。
03-如何访问一个对象
有两种方式:
- 句柄
- 直接指针
04-GC的基本原理
-
为什么回收垃圾?如果不进行垃圾收集,内存数据很快就会被占满。
-
什么是垃圾?在内存中,没有被引用的对象就是垃圾。
-
如何找到垃圾?
- 主要有两种方法:引用计数法和根可达算法。
-
如何清除垃圾?
- JVM提供三种方法清除垃圾对象:
- Mark-Sweep 标记清除算法:效率不高,产生空间碎片,主要回收老年代。
- Copying 拷贝算法:效率很好,浪费内存空间,主要回收年轻代。
- Mark-Compact 标记压缩算法:性能相对较低,主要回收老年代。
- JVM提供三种方法清除垃圾对象:
-
用什么清除垃圾?
- 有8种不同的垃圾回收器,它们分别用于不同分代的垃圾回收。
- 新生代回收器:Serial、ParNew、Parallel Scavenge
- 老年代回收器:Serial Old、Parallel Old、CMS
- 整堆回收器:G1、ZGC
- 有8种不同的垃圾回收器,它们分别用于不同分代的垃圾回收。
-
对象引用类型:
- 强引用
- 软引用
- 弱引用
- 虚引用
- 无引用
学习:Java 业务开发常见错误 100 例学习笔记