Java 垃圾回收 - 收集算法
续前节,前面列举了Java判断对象是否可回收的两种方法;可达性分析与引用权重法。多数虚拟机所采用的的是可达性分析方法。下面写一下Java中的垃圾收集算法。
Java中垃圾收集算法主要有4中算法分别为:标记-清除法;复制算法;标记-整理法;分代收集算法。详情如下。
1、标记-清除法
标记清除法算法主要分两个阶段进行;①、标出所有需要回收的内存片段,②、回收所标记内存。此种方法存在两种不足。一、标记、清除两个过程对性能损耗较大,效率太低;二、标记清除后会产生大量的内存碎片。如下图:
2、复制算法
复制算法采用将Java程序申请的内存一分为二;此处用(A、B代表);首先使用A块内存;当到了GC回收时;将A内存中的所有存活对象所占用的内存片段复制并整理到B内存块中。A->B; B->A 以此方式交替进行。此方法存在弊端为;消耗大量内存空间、具体如下图:
3、标记-整理法
由于有的对象存活率较高对其它对象依赖程度也相对较高(可称为 老年代);以上两种方法都不能满足所以产生了此种算法:标记整理法。此方法与标记清理方法类似;后续清除方法不同;流程:标记->将存活对象向一端移动->清除 清除端对象。如下图:
4、分代收集算法
分代收集算法主要将内存分为新生代;老年代两种。在新生代中由于大批量对象处于可回收对象;所以采用复制算法。在老年代中由于大量对象并不需要清除操作;因此可以采用:标记-清除算法 或者 标记-整理算法。