JVM虚拟机分析—2.关于垃圾回收的算法

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/javawebty/article/details/81260160

垃圾回收(GC)是java提供的重要功能,他让程序员可以不用关注内存的使用,而是将注意力集中在功能实现上,解放了程序员。以下将讲述一下垃圾回收的几种算法。


1、Mark-Sweep(标记-清除算法)
如他的名字一样,Mark-Sweep算法顾名思义,将不同的内存空降标记出来然后清楚。
图片来自网络
以上图片便描述了该算法,可以看到,该算法有个十分大的问题就是清除后内存空间不连续,导致了许多空间碎片。
还有的问题就是该算法标记和清除的效率都不高。

2.复制算法
复制算法将内存分为两块同等的区域,每次只用一块,当使用的区域无法进行分配的时候,则将该区域所有存活的对象全部复制到另外一块区域,然后将该区域全部清除即可。
该算法可以有效解决空间碎片的问题,但是一次将内存分为等分两块,内存空间使用太浪费了,在大部分商业的虚拟机中,虚拟机都是将内存分为一块较大的内存区,和两块较小的内存区,每次使用的时候都只使用较大的内存区与其中一块较小的内存区。当需要清理的时候则将两块内存区存活的对象全部复制到那个没有使用的较小内存去即可。
这种算法比较适合对象“朝生夕死”比较频繁的场景下。(即java中所说的新生代)
图片来自网络
当然这里有这样一种情况,当未使用的较小内存没有足够空间来存储存活的对象的时候,该怎么办?这个就需要进行分配担保了,即将那些无法容纳的对象放到JAVA的方法区里面(具体实现可能不同),总之就是找一块额外的区域进行担保,防止以上情况。
3.Mark-Compact(标记-整理算法)
标记-整理算法的过程与标记-清除算法类似,但是在清理的时候并不是直接进行回收,而是将所有存活的对象向一端移动,然后清理掉端边界以外的内存。
图片来自网络

以上图片均来自网络

阅读更多

没有更多推荐了,返回首页