垃圾回收
垃圾回收算法
- 引用计数算法(循环引用会导致内存不会被释放,即内存溢出)
- 可达性分析算法:通过一系列的 GC roots 为起点,遍历所有能够从这些根对象到达的对象。如果一个对象从任何 GC roots 都不可达,那么认为这个对象时垃圾对象,可以被 GC 回收,
- GC roots
- 虚拟机栈中引用的对象(主要是局部变量表)
- 方 法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中 JNI 引用的对象
- GC roots
如何回收
- 标记-清除算法 (内存碎片过多)
- 复制算法
- 标记整理算法
- 分代收集算法
- Java 堆(Java Heap)分为新生代和老年代
- 新生代(Young Generation) --> 大批对象死去,少量存活(复制算法)
- Eden
- Survivor
- From
- To
- 老年代(Old Generation):对象存活率高,没有额外空间(标记-清除算法、标记整理算法)
- 新生代(Young Generation) --> 大批对象死去,少量存活(复制算法)
- Java 堆(Java Heap)分为新生代和老年代
minor gc
- 清空 Eden 区
- 将未被回收的对象转移到 Survivor 的 From 区,如果 From 区空间不足,则直接放到 Old 区。
- 将 Survivor 的 From 区未被回收对象转移到 To 区。如果 To 区空间不足,则直接放到 Old 区。