初识Java虚拟机(4)垃圾回收算法
2017-01-22 15:44
190 查看
标记-清除算法
首先标记处所有需要回收的对象,标记完成后统一回收所有被标记的对象。该方法的主要不足有两个,一是效率问题,标记和清除两个过程的效率都不高;另一个是空间问题,标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后的程序运行过程中需要大内存对象时,无法找到足够的连续内存而不得不提前出发另一次垃圾回收动作。
复制算法
为了解决效率问题,复制算法将内存分为大小相等的两块,每次只使用其中的一块。当一块内存用完了,就将回收后剩下的对象复制到另一块上,然后把已经使用过的内存一次清理掉。这种算法简单高效,代价是将内存缩小为原来的一半。
现在的商业虚拟机都使用经过改进的复制算法来回收新生代。在新生代中,98%的对象是朝生夕死的,所以并不需要按照1:1的比例来划分内存空间。而是分为一块较大的Eden和两块较小的Survivor空间。每次使用Eden和一块Survivor,当回收时,将Eden和Survivor中的存活对象一次性复制到另一款Survivor中。默认是8:1:1,每次使用90%的内存,浪费很少。当偶尔Survivor空间不够用时,需要依赖其他内存(老年代)进行分配担保。
标记-整理算法
复制收集算法在对象存活率较高时,效率会遍地变低。根据老年代的特点,使用标记-整理算法。在标记过后,让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存。
分代收集算法
根据对象存活周期的不同将内存划分为几块,一般是把Java堆分为新生代和老年代,根据不同代的特点采用不同的回收算法。新生代存活率低,使用改进的复制算法,老年代存活率高,使用标记-整理算法或标记-清除算法。
首先标记处所有需要回收的对象,标记完成后统一回收所有被标记的对象。该方法的主要不足有两个,一是效率问题,标记和清除两个过程的效率都不高;另一个是空间问题,标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后的程序运行过程中需要大内存对象时,无法找到足够的连续内存而不得不提前出发另一次垃圾回收动作。
复制算法
为了解决效率问题,复制算法将内存分为大小相等的两块,每次只使用其中的一块。当一块内存用完了,就将回收后剩下的对象复制到另一块上,然后把已经使用过的内存一次清理掉。这种算法简单高效,代价是将内存缩小为原来的一半。
现在的商业虚拟机都使用经过改进的复制算法来回收新生代。在新生代中,98%的对象是朝生夕死的,所以并不需要按照1:1的比例来划分内存空间。而是分为一块较大的Eden和两块较小的Survivor空间。每次使用Eden和一块Survivor,当回收时,将Eden和Survivor中的存活对象一次性复制到另一款Survivor中。默认是8:1:1,每次使用90%的内存,浪费很少。当偶尔Survivor空间不够用时,需要依赖其他内存(老年代)进行分配担保。
标记-整理算法
复制收集算法在对象存活率较高时,效率会遍地变低。根据老年代的特点,使用标记-整理算法。在标记过后,让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存。
分代收集算法
根据对象存活周期的不同将内存划分为几块,一般是把Java堆分为新生代和老年代,根据不同代的特点采用不同的回收算法。新生代存活率低,使用改进的复制算法,老年代存活率高,使用标记-整理算法或标记-清除算法。
相关文章推荐
- 深入理解Java虚拟机 读书笔记 之 垃圾回收算法的演变
- Java虚拟机--垃圾回收算法(六)
- Java虚拟机垃圾回收(一) 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析
- 【Java虚拟机】之二 垃圾回收算法
- Java虚拟机--垃圾回收算法(六)
- java虚拟机参数和垃圾回收算法学习记录
- Java虚拟机--垃圾回收算法(六)
- java虚拟机之垃圾回收算法
- Java虚拟机--垃圾回收算法(六)
- Java虚拟机垃圾回收(二) 垃圾回收算法:标记-清除算法 复制算法 标记-整理算法 分代收集算法 火车算法
- Java虚拟机--垃圾回收算法(六)
- 深入理解java虚拟机[垃圾回收算法]
- 深入理解Java虚拟机--垃圾回收算法
- 深入理解java虚拟机--->垃圾回收算法
- java虚拟机垃圾回收算法剖析
- Java虚拟机--垃圾回收算法(六)
- 深入理解Java虚拟机 -- 读书笔记(2):常用垃圾回收算法
- Java虚拟机--垃圾回收算法(六)