算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。而JVM(Java Virtual Machine)则是Java虚拟机,是一种用于计算设备的规范。JVM垃圾收集算法是JVM和算法的完美结合,下面我们简要分析Java中的4种垃圾回收算法。
分为两个阶段:
· 标记阶段:标记可以被回收的对象;
· 清除阶段:回收被标记的对象内存;
标记-清除算法时最基础的算法,因为后面提到的垃圾回收算法都是基于此算法的基础上面改造的,标记-清除算法的执行过程如下:
标记-清除算法主要有两个缺点:一是标记和清除的效率都不高;二是如上图所示,在标记清除可回收的对象空间后,会产生大量不连续的内存碎片,碎片太多可能会导致后续没有足够的内存分配给较大的对象,从而导致触发新一轮的垃圾收集动作。
为了解决标记-清除算法带来的内存碎片的问题,于是提出了复制算法。复制算法把内存空间划分为大小相等的两块,每次只使用其中的一块,然后再把另一块内存空间清理掉:
复制算法存在着复制效率低的不足,并且如果不想浪费 50% 空间内存,则需要提供额外的空间担保,以应对被使用的内存中所有的对象都 100% 存活的极端情况。
复制算法一般不使用在老年代,因为在老年代中,大部分的对象的存活率比较高,选择复制算法就会导致过多的复制操作,导致效率变低。同时也不采用标记-清除算法,因为会产生过多的内存碎片,导致容易触发新的一轮垃圾回收动作。于是出现了一种标记-整理算法(标记-压缩算法)。标记-整理算法与标记-清除算法不同的是,在标记完内存中的对象以后,把存活下来的对象压缩到内存的一端,使得他们紧凑地排序在一起,然后对存活对象边界外的对象进行回收。
分代收集算法会结合不同的多种垃圾算法来处理不同的空间,因此在学习分代收集算法之前首先需要了解 Java 堆的空间划分。Java 堆被划分为新生代(Young Generation)和老年代(Tenured Generation),而新生代又被细分为 Eden 空间、From Survivor 空间和 To Survivor 空间。因为在 Java 堆里面,大部分对象都是"朝生夕灭",只有少数的对象的生命周期比较长,甚至有的对象的生命周期和虚拟机的生命周期一样长,对不同对象地生命周期采用不同的垃圾收集算法,这就是分代收集的概念。
上述的4种Java垃圾收集算法算是JVM处理垃圾的核心算法,我们在领略JVM垃圾收集算法的魅力的同时也要牢记这些算法的核心知识。事实上,Java垃圾回收算法为Java开发解决了很多的问题,详情我们可以在动力节点在线的视频课程中寻找相关的解决方案。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54