jvm垃圾回收机制介绍

垃圾回收算法介绍

  • 引用计数(reference counting)
    比较古老回收算法。原理是此对象有一个引用,引用数就加1,删除一个引用则减少1。垃圾回收时只收集计数为0的对象。此算法无法处理循环引用的问题

  • 标记清除(mark-sweep)
    此算法分为两个阶段,第一阶段从引用根节点标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除掉。此算法需要暂停整个应用,且存在内存碎片

  • 复制(copying)
    内存空间分成两个均等的空间,对象只在一个空间使用,当需要垃圾回收时,将所有存在引用的对象放到另一块内存空间里。缺点是要两份空间

  • 标记整理(mark Compact)
    此算法分为两个阶段,第一阶段从引用根节点标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除掉并把剩下的存活对象压缩到一块,按顺序排放。

  • 分代整理(generational Collecting)
    基于对对象生命周期分析得出的垃圾回收算法,把对象的存储分为新生代、老生代、持久代,对于不同生命周期的对象使用不同的算法进行回收。
    新生代复制算法(survivor区总有一个是空的),老生代标记整理

堆内存垃圾回收方式有:串行回收,并行回收、CMS、G1(Garbage first)

  • 串行回收
    新生代算法:复制算法
    老生代算法:标记整理
    适合与单机且堆内存很小,回收期间停止所有应用线程

  • 并行回收
    新生代算法:复制算法
    老生代算法:标记整理
    与串行回收算法的处理一样,只是多个线程来做不同的事并行处理,回收期间停止所有应用线程

  • CMS,全称Concurrent Low Pause Collector
    初始标记(CMS-initial-mark) -> 并发标记(CMS-concurrent-mark) -> 重新标记(CMS-remark) -> 并发清除(CMS-concurrent-sweep) ->并发重设状态等待下次CMS的触发(CMS-concurrent-reset)。
    1、3会暂停应用线程,短暂停。

    初始标记 :在这个阶段,需要虚拟机停顿正在执行的任务,官方的叫法STW(Stop The Word)。这个过程从垃圾回收的”根对象”开始,只扫描到能够和”根对象”直接关联的对象,并作标记。所以这个过程虽然暂停了整个JVM,但是很快就完成了。
    并发标记 :这个阶段紧随初始标记阶段,在初始标记的基础上继续向下追溯标记。并发标记阶段,应用程序的线程和并发标记的线程并发执行,所以用户不会感受到停顿。
    重新标记 :这个阶段会暂停虚拟机,收集器线程扫描在CMS堆中剩余的对象。扫描从”跟对象”开始向下追溯,并处理对象关联。
    并发清理 :清理垃圾对象,这个阶段收集器线程和应用程序线程并发执行。
    并发重置 :这个阶段,重置CMS收集器的数据结构,等待下一次垃圾回收。

  • G1垃圾回收(Gabarge first)
    G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征. 在Oracle JDK 7 update 4 及以上版本中得到完全支持, 专为以下应用程序设计:
    1.可以像CMS收集器一样,GC操作与应用的线程一起并发执行
    2.紧凑的空闲内存区间且没有很长的GC停顿时间.
    3.需要可预测的GC暂停耗时.
    4.不想牺牲太多吞吐量性能.
    5.启动后不需要请求更大的Java堆.
    G1执行垃圾回收的处理方式与CMS相似. G1在全局标记阶段(global marking phase)并发执行, 以确定堆内存中哪些对象是存活的。标记阶段完成后,G1就可以知道哪些heap区的empty空间最大。它会首先回收这些区,通常会得到大量的自由空间. 这也是为什么这种垃圾收集方法叫做Garbage-First(垃圾优先)的原因。顾名思义, G1将精力集中放在可能布满可收回对象的区域, 可回收对象(reclaimable objects)也就是所谓的垃圾. G1使用暂停预测模型(pause prediction model)来达到用户定义的目标暂停时间,并根据目标暂停时间来选择此次进行垃圾回收的heap区域数量.
    被G1标记为适合回收的heap区将使用转移(evacuation)的方式进行垃圾回收. G1将一个或多个heap区域中的对象拷贝到其他的单个区域中,并在此过程中压缩和释放内存. 在多核CPU上转移是并行执行的(parallel on multi-processors), 这样能减少停顿时间并增加吞吐量. 因此,每次垃圾收集时, G1都会持续不断地减少碎片, 并且在用户给定的暂停时间内执行. 这比以前的方法强大了很多. CMS垃圾收集器(Concurrent Mark Sweep,并发标记清理)不进行压缩. ParallelOld 垃圾收集只对整个堆执行压缩,从而导致相当长的暂停时间。
    需要强调的是, G1并不是一款实时垃圾收集器(real-time collector). 能以极高的概率在设定的目标暂停时间内完成,但不保证绝对在这个时间内完成。 基于以前收集的各种监控数据, G1会根据用户指定的目标时间来预估能回收多少个heap区. 因此,收集器有一个相当精确的heap区耗时计算模型,并根据该模型来确定在给定时间内去回收哪些heap区.
    注意 G1分为两个阶段: 并发阶段(concurrent, 与应用线程一起运行, 如: 细化 refinement、标记 marking、清理 cleanup) 和 并行阶段(parallel, 多线程执行, 如: 停止所有JVM线程, stop the world). 而 FullGC(完整垃圾收集)仍然是单线程的, 但如果进行适当的调优,则应用程序应该能够避免 full GC。

你可能感兴趣的:(jvm垃圾回收机制介绍)