碎片太多会导致因大对象没有足够连续空间而提前GC
- 碎片化必须依赖更为复杂的内存分配器和内存访问器来解决标记复制: 内存分两块,将存活的对象复制到另一块内存中
适合新生代(IBM对新生代的特点进行了分析...复制的开销会很大优点:
- 实现简单,内存连续,对象分配高效标记整理: 存活对象往内存一端移动, 关注吞吐量
适合有大量存活的对象,比如老年代
- G1的老年代就是基于这种算法的缺点:
- 整理时对象可能需要移动...,移动存活对象并更新引用是极为负重的操作,此时就必须要STW(Stop The World);
扩充知识:
标记清理和标记整理算法在标记过程算法一样,但是后续步骤中,标记整理时会让所有存活的对象望内存空间的一端移动...,这样会增加额外的负担,影响到应用程序的吞吐量
采用标记复制算法的G1默认比例8:1:1; 也就是说每次8+1的对象往1的内存空间中移动,那么如果超过10%的对象存活,那么这时候是通过依赖其他内存区域(...,用两个进行比较;
回收算法
CMS: 标记清理
G1: 整体标记整理, 局部(从Region的角度上来看)标记复制;内存占用; 都使用卡表来处理跨带引用
CMS: 卡表结构简单,内存占用小
G1: 卡表实现复杂