垃圾回收机制 GC

222 阅读2分钟

对象存活的两种判断

  1. 引用计数法 (缺陷:循环引用)
  2. 根可达算法,从GC Roots 对象开始查找没有任何引用的对象

GC Roots 对象

  1. 虚拟栈中引用的对象
  2. 本地方法栈JNI引用对象
  3. 本地方法静态类属性引用对象
  4. 方法区常量池引用的对象

垃圾回收算法

  1. 标记清除算法 (效率低,空间碎片多)

    a. 从跟节点标记所有可达对象 
    b. 清除未被标记对象
    
  2. 标记整理算法 (效率低,没有空间碎片)

    a. 从跟节点标记所有可达对象
    b. 移动所有可达对象到一端
    c. 清除边界外的所有对象  
    
  3. 复制算法 (效率高,没有空间碎片,但是耗内存,对象存活过多,会有太多对象进行复制,影响效率,只适用于少数对象复制的场景)

    a.从根节点标记所有可达对象 
    b. 复制所有可达对象到另一块内存
    c.清除前面内存整个空间
    

由于上述的几种算法各有优缺点,所以使用分代算法去合理利用上面的3中算法

分代算法

  1. 年轻代 ,Eden , S0, S1, =年轻代存活对象相对较少,可以使用复制算法提高效率和解决空间碎片问题
  2. 老年代, 老年代存活对象过多,使用标记整理算法
  3. 永久代,永久代基本很少被清理,使用标记整理算法

垃圾回收器有哪些

  1. Serial 收集器 (复制算法) 新生代收集器 单线程收集器
  2. Serial old 收集器(标记整理算法)老年代收集器 单线程收集器
  3. ParNew收集器(复制算法)新生代收集器 多线程收集器
  4. Parallel Scavenge (复制算法)新生代收集器, 追求高吞吐量
  5. Parallel Old收集器(标记整理算法)老年代收集器 吞吐量优先
  6. CMS(Concurrent Mark Sweep)收集器(标记清楚算法)老年代并行收集器,追求最短GC停顿
  7. G1收集器(标记整理算法)