垃圾收集算法
1.标记-清除算法Mark-Sweep
缺点:效率低;有内存碎片。
2.复制算法Copying
将可用内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活着的对象复制到另一块上面,然后再把已经使用的内存空间一起清理掉。
缺点:内存缩小为原来的一半,对象存活率高时复制操作多
优点:没有内存碎片,实现简单,运行高效
3.标记-整理算法Mark-Compact
让所有存活对象移动到一端,然后直接清理掉端边界以外的内存。
4.分代收集算法Generational Collection
根据对象存活周期不同,将内存划分为新生代和老年代,新生代采用复制算法,老年代采用标记-清理或标记-整理算法。
新生代包含:Eden区和两个Suivivor区(from和to),一般-XX:SuivivorRatio=8
对象优先分配在Eden区和From区,大对象根据 -XX:PretenureSizeThreshold=3145728设置分配到老年代。
一次MinorGC做的事情:
1.回收Eden区和From区对象
2.将Eden区和From区存活对象复制到To区
2.1成功,年龄+1
2.1.1年龄超过阈值MaxTenuringThresold,复制到老年代
2.2失败,分配担保到老年代
3.清空Eden区和From区
4.From区变To区,To区变From区,变化角色后的From区有上次GC留下的对象,To区为空
垃圾收集器
1.Serial-serial old
单线程,stop the world,简单高效
2.ParNew-Serial old
新生代多线程,老年代单线程
3.Parallel Scavenge-Parallel old
多线程,吞吐量优先,GC停顿时间缩短是以牺牲吞吐量和新生代空间换取的。
4.Serial-CMS
新生代serial,老年代CMS
Concurrent Mark Sweep,并发标记清除,多应用在BS服务端,以获取最短回收停顿时间为目标。四个过程:
初始标记:stop the world,单线程
并发标记:
重新标记:stop the world,并行
并发清除:
缺点:
1.对CPU资源敏感
2.无法处理浮动垃圾
3.大量空间碎片
5.Parnew-CMS
新生代Parnew,老年代CMS
6.G1
基于标记-整理算法,实时垃圾收集器,优先回收垃圾最多的区域。可以实现基本不牺牲吞吐量的前提下完成低停顿的内存回收。