说明:对可回收的空间进行标记,回收垃圾时对已标记的空间进行回收。
优点:简单,快速
缺点:会产生不连续空间碎片。
说明:对内存空间进行分半,对其中一半进行使用,当空间不足时,将使用的那一步进行整理、回收后移动至未使用的另一半内存控件。
优点:不会产生不连续空间碎片,内存是整整齐齐的。
缺点:空间的浪费(会存在一半的空间浪费)、需要对内存进行移动存在风险
说明:在回收前,对所有的可回收的内存进行标记,垃圾回收时,把存活的内存进行的整理,剩下的直接进行回收。
优点:不会产生不连续空间碎片,内存是整整齐齐的。
缺点:需要对内存进行移动存在风险
上面的回收机制都存在着各自的缺点,那么在java中gc用的哪种呢?
回答是:这三种方式配合的使用,组成了多种的回收机制策略。
在此前提,还需要了解一个东西,堆中的划分(新生代 - 老年代)
新生代 ====》 Eden :Survivor:Survivor 8:1:1
====》 E :S1:S2
====》 第一次GC E 和S1存活的放在 S2
====》 第二次GC E 和S2存活的放在 S1
====》 循环数次后
====》 将存活次数超多15次(默认值,可配置)的空间,存放至老年代。
新生代 一般使用 (复制算法)minor GC
老年代 根据算法的不同,使用的算法也不同。