如何定位垃圾
- 引用计数 Reference Counting
缺点:无法解决循环引用 - 可达性分析 Tracing GC(GC Root)
可以作为 GC Root 的对象
- JVM stack:Java 虚拟机栈(栈帧中的本地变量表)引用的对象
- native method stack:本地方法栈中引用的对象
- run-time constant:运行时常量池
- static references in method area:方法区中静态变量引用的对象
常见 GC 算法
- 标记清除 Mark-Sweep(老年代)
缺点:内存不连续,产生碎片 - 拷贝算法 Copying (年轻代,98%朝生夕死)
优点:内存连续,没有碎片
缺点:空间开销高 - 标记整理 Mark-Compact(老年代)
优点:没有碎片,不浪费空间
缺点:效率偏低
算法 | 移动对象 | 空间开销 | 时间开销 |
---|---|---|---|
Mark-Sweep | 否 | 低(有碎片) | mark 阶段与存活对象的数量成正比 O(L),sweep 阶段与整堆大小成正比 O(H) |
Mark-Compact | 是 | 低(无碎片) | mark 阶段与存活对象的数量成正比 O(L),compaction 阶段与存活对象的大小成正比 O(L) |
Copying | 是 | 高 | 与存活对象大小成正比 O(L) |
堆内存分代模型
新生代 + 老年代 + 永久代(1.7) / 元数据区(1.8) Meta Space
新生代 = eden + 2 * survivor
元数据区大小受限于物料内存
1.7 字符串常量存在永久代,1.8 存在堆
Eden : Survivor From : Survivor To = 8 : 1 : 1
新生代 : 老年代 = 1 : 2
年轻代回收过程
- Y