目录
一.分代收集理论
1.弱分代假说:绝大多数对象都是朝生夕灭的。
2.强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡。
这两个假说奠定了多款垃圾收集器统一的设计原则:收集器应该将java堆划分成不同的数据区域,然后依据其年龄进行回收。(通俗来说死贼快的放一起,难以消亡放一起),以较低的频率回收空间,兼顾了垃圾收集的时间开销和内存空间的效益。
4.新生代和老年代:每次垃圾收集时都发现有大批对象死去,而每次回收后存活的少量对象,将会逐步晋升到老年代中存放。(新生代就是死贼快的,老年代就是不容易消亡的)
5.跨代引用假说:存在互相引用关系的两个对象,是趋向同时生存或消亡的
二.垃圾收集算法
1.标记-清除算法
最早的垃圾清除算法,后序的大部分垃圾收集算法都是以它为基础
分为标记和清除两个阶段
标记所有需要回收的对象,然后统一回收
反过来也行
标记所有存活的对象,回收没有标记的
缺点:1.程序效率不稳定:当Java堆中包含大量对象,而其中大部分是需要被回收的,这时必须进行大量标记和清除动作,导致标记和清除两个过程的执行效率都随对象数量的增长而降低。
2.内存碎片化:标记、清除之后会产生大 量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找 到足够的连续内存而不得不提前触发另一次垃圾收集动作。
2.标记-复制算法
把内存一分为二,每次用一半,当这一半用完了,就把存活的复制到另外一半,然后再把已经使用的一次性清空掉。
优点:实现简单,运行高效
缺点:1.如果大部分都是存活的那么这种算法就会产生大量的复制的开销,2.可用空间变为了原来的一半
3.标记-整理算法
针对老年代,与标记清除类似,后续不是直接清除而是向一段移动,然后清除掉。
与标记清除发的区别:标记-整理算法是移动式的,而标记-清除算法是非移动式的
优点:1.移动完会使内存更加规整
2.如果老年代多,基本上都不移动
缺点:1.如果不应用于老年代,需要移动的对象过多就会消耗大量资源
2.移动时必须暂停所有程序(世界停止)