垃圾回收算法
垃圾的判别
- 引用计数法:实现简单,判定效率高,回收没有延迟;无法解决循环引用的问题;
- 可达性分析算法(根搜索算法):没有循环引用的问题,防止内存泄漏
GCRoot包含哪些
- 虚拟机栈中引用的对象:局部变量
- 本地方法栈中引用的对象
- 类静态属性引用的对象
- 方法区中常量引用的对象
- 被同步锁持有的对象
- java虚拟机内部的引用
垃圾回收的算法
- 标记-清除算法:把未标记的清除,存在内存碎片化问题
- 复制算法:不存在内存碎片化问题;但是需要俩倍的内存空间;新生代选择此算法
- 标记-整理算法:通过指针碰撞实现;效率不高;老年代使用;
- 分代收集算法: 不同内存区域选择不同的垃圾回收策略
- 增量收集算法:分阶段的垃圾回收,和用户线程交替执行,降低STW的时间,实现低延迟的效果
- 分区算法:用于动态内存分配和释放
对象引用类型
- 强引用:不回收
- 软引用:内存不足回收
- 弱引用:发现即回收
- 虚引用:对象回收跟踪
垃圾回收器
GC的评估指标
- 吞吐量:程序的运行时间指标
- 暂停时间(STW):执行垃圾回收时,用户工作线程被暂停的时间
- 内存占用:堆区所占用的内存大小
垃圾回收器
- Serial GC:串行回收,使用复制算法
- Serial Old GC:串行回收,使用标记整理算法
- Parallel Scavenge GC:吞吐量优先垃圾回收器,jdk8默认的垃圾回收器,年轻代回收
- Parallel Old GC:吞吐量优先垃圾回收器,jdk8默认的垃圾回收器,老年代回收
- ParNew GC:并行回收,使用复制算法
- CMS GC:低延迟垃圾回收器,标记-清除算法,会有碎片,老年代回收
- G1:区域化,分代式垃圾回收器,尽可能高的吞吐量下保证延迟可控
- ZGC:提供低延迟和高吞吐量的垃圾收集。它专注于减少长时间的垃圾回收停顿,并在大内存堆上进行高效的垃圾回收。
GC日志
日志参数
名称 | 说明 |
---|---|
-XX:+PrintGC | GC标准输出日志 |
-XX:+PrintGCDetails | GC详细的日志信息 |
-Xloggc:./logs/gc | GC垃圾回收的日志文件存储位置 |