前言
总结了一下jvm gc的各种概念。理解GC的各个概念层次应该是:
判断对象已死–>回收算法–>根据算法实现的垃圾回收器分类, 这样更好理解;
判断对象是否可回收方法
引用计数器
当前对象如果有引用则+1,取消引用-1,当为0时回收。
可达性分析算法
通过根”GC Roots“的对象做为起点,往下搜索, 搜索的路径为引用链,没有在引用链上的对象都是可回收对象。
垃圾回收算法
标记-清除算法
最基础的算法,先标记已死对象,在清除对象,缺点容易产生内存碎片。
标记-整理算法
基于标记-清楚算法,清除时对内存空间进行整理,在清除。
复制算法
把内存一分为二,一半用于生产,发生GC时,把还活着的对象复制到另一半内存空间,整体清理掉之前的一半。缺点是把内存缩小了一半。
分代收集算法
分代收集是把堆分为新生代和老年代,根据不同的分区用不同的算法,新生代使用复制算法,老年代使用标记-整理或者标记-清除算法。
GC回收器分类
新生代
Serial:最基本的,单线程执行,运行时必须停止所有其他线程。(复制算法)
ParNew:Serial的多线程版本(并行、复制算法)
Parrallel Scavenge: 多线程并行的收集器,类似ParNew,不同的是他的关注点是吞吐 量;所谓吞吐量就是CPU用于运行用户代码的时间与CPU总
消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚
拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。(复制算法)老年代
Serial old:Serial的老年代版本(标记-整理算法)
Parallel old:Parrallel Scavenge老年代版本(标记-整理算法)
CMS:(Concurrent Mark Sweep)是一种以获取最短回收时间为目标的收集器并且是并发执行的,即系统停顿时间最短。(标记-清除算法)G1收集器
G1是不在区分单独的新生代老年代的收集器,主要是内存布局的差别;G1把整个java堆分成多个大小相等的独立区域,命名为Region。之所以说G1是最好的收集器,原因是它可避免在整个堆中进行垃圾回收,G1是跟踪各个Region里面的垃圾堆积大小,优先回收价值最大的Region(可回收空间最大)。整体看是(标记-清理算法),局部看是(复制算法)。
参考文献《深入理解java虚拟机 第二版》