JVM垃圾收集算法思想

算法思想:
标记-清除 算法
分为两个阶段:标记和清除。首先标记出所有需要回收的兑现,标记完成后统一进行回收。 标记过程就是JVM判断对象是否还“活着”的过程。算法不足:效率问题,标记和清除两个阶段的效率都不高;标记清除之后会产生大量不连续的内存碎片,碎片太多时,若要存储较大对象时无法找到足够的连续存储空间则不得不提前触发另一次垃圾收集动作。

复制算法
将可用内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活的对象复制到另一块,然后把已使用过的内存空间一次清理掉,这样就是每次都对整个半区进行回收,内存分配时就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配即可。
Eden和Survivor的默认比例为8:1(由参数 SurvivorRatio 参数控制 默认为8),也就是每次新生代中可用内存为整个新生代容量的 90%,只有 10%的内存会被“浪费”。但是我们没法保证每次都有少于10%的对象存活,当Survivor空间不够用时,需要依赖其它内存(这里指老年代)进行分配担保(Handle Promotion)。

标记-整理算法
标记过程和标记清除算法标记过程一样,只不过标记整理算法不是直接清理可回收对象,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。 一般为老年代所用。

分代收集
根据对象生存周期的不同,将内存分为几块,一般是分为新生代和老年代,然后根据各个年代的特点采用最适当的收集算法。 

你可能感兴趣的:(虚拟机,jvm,java,内存管理)