GC的作用范围是方法区和堆区,次数上频繁收集Young区、次数上频繁收集Old区、基本不动Perm区(特殊情况也会清除永久区)。
JVM在进行GC时,并非每次都对三个内存区域一起回收的,大部分时候回收的都是指新生代。
所以GC按照回收的区域又分了两种类型,一种是普通GC(minor GC)
,一种是全局GC(major GC or Full GC)
。
普通GC(minor GC):只针对新生代区域的GC。
全局GC(major GC or Full GC):针对年老代的GC,偶尔伴随对新生代的GC以及对永久代的GC。
![](https://img-blog.csdnimg.cn/20191106194933491.bmp)
一、引用计数法(废弃)
一旦对象被引用,就开始计数。无引用,计数器就自减,减至0就会被垃圾回收。
JVM的GC一般都不使用这种方式,因为它每次对对象赋值时,都要维护引用计数器,且计算器本身有一定的消耗;其次很难处理循环引用。
![](https://img-blog.csdnimg.cn/20191106194941456.png)
二、复制算法(Coping)
年轻代中使用普通GC,这种GC算法采用的就是复制算法。
(1)基础原理
HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to),比例是8:1:1。
Minor GC
会把Eden
(伊甸区)中的所有活的对象都移到Survivor
区域中,如果Survivor
区中放不下,那么剩下的活的对象就被移到Old generation
(养老区)中,此时Eden是就变成空的了。
![](https://img-blog.csdnimg.cn/2019110619495185.png)
(2)优缺点
比较 | 描述 |
---|---|
优点 | 扫描一次就直接复制过去,效率高;挪动的对象相连,无内存碎片 |
缺点 | 需要双倍空间,浪费内存 |
![](https://img-blog.csdnimg.cn/20191106194959898.png)
(3)动图演示
![](https://img-blog.csdnimg.cn/20191106195008876.gif)
三、标记清除(Mark-Sweep)
老年代一般是由标记清除或者是标记清除与标记整理的混合实现!
(1)基础原理
当堆中的有效内存空间被耗尽时,就会停止整个程序(stop the world),然后进行两项工作,第一项则是标记,第二项则是清除。
标记:从引用根节点开始标记所有被引用的对象。标记的过程其实就是遍历所有的GC Roots,然后将所有GC Roots可达的对象 标记为存活的对象。
清除:遍历整个堆,把未标记的对象清除。
(2)优缺点
比较 | 描述 |
---|---|
优点 | 不需要额外的内存空间 |
缺点 | 标记时需要暂停整个应用,会产生内存碎片(空闲内存不连续);扫描两次,比较耗时 |
(3)动图演示
![](https://img-blog.csdnimg.cn/20191106195020243.gif)
四、标记压缩/标记整理(Mar k-Compact)
老年代一般是由标记清除或者是标记清除与标记整理的混合实现
(1)基础原理
在整理压缩阶段,不再对标记的对像做回收,而是通过所有存活对像都向一端移动,然后直接清除边界以外的内存(标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存会被清理掉)。
![](https://img-blog.csdnimg.cn/20191106195045698.png)
比较 | 描述 |
---|---|
优点 | 弥补标记/清除算法内存区域分散的缺点,消除了复制算法内存减半的高额代价 |
缺点 | 效率不高,不仅标记所有存活对象,还要整理所有存活对象的引用地址,效率低于复制算法 |
五、标记清除压缩(Mark-Sweep-Compact)
标记清除(Mark-Sweep)与标记压缩/标记整理(Mar k-Compact)的结合!减少了移动对象的成本。
![](https://img-blog.csdnimg.cn/20191106195104252.gif)
总结
(1)内存效率:复制算法(最快)>标记清除算法>标记整理算法(此处的效率只是简单的对比时间复杂度,实际情况不一定如此)。
(2)内存整齐度:复制算法=标记整理算法>标记清除算法。
(3)内存利用率:标记整理算法=标记清除算法>复制算法。
☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!
☞本人博客:https://coding0110lin.blog.csdn.net/ 欢迎转载,一起技术交流吧!