分代收集理论
jvm的垃圾回收算法建立在分代收集理论上面,他有2个假说, 弱分代假说和强分带假说,弱分带说的是对象都是朝生夕灭的,强分带说的是对象存活越久越难以消亡。具体是jvm吧堆分成2个区域一个是新生代一个是老年代,他们各自有不同的算法。
一、垃圾回收算法
对于新生代:可以只关注如何保留少量存活而不是去标记那些大量将要被回收的对象.
对于老年代:可以降低垃圾收集频率,同时更加关注那些要消亡的对象。
1.标记-清除算法
算法分2个阶段:
标记 : 标记出所有需要回收的对象
清除:回收所有被标记的对象
这个算法存在2个缺点:
1.当有大量对象要标记的时候会很慢,效率上很不稳定
2.清除后会导致内存碎片化,如果有一个大的对象进来没有合适的内存空间就又会导致触发一次回收算法。
主要应用于老年代,因为要回收的少
2、标记-整理算法
为了降低内存消耗引入的针对性算法标记-整理,和标记-清除一样的步骤,但是多了一步整理,他会吧标记好的对象全部移动到内存的一端然后一起清除。
他解决了内存碎片化问题,但是效率上很低。
主要应用于老年代,移动对象是很大的负担,而且这种对象移动操作必须全程暂停用户应用程序(Stop The World)才能进行
2、标记-复制算法
标记-复制算法解决了标记-清除算法效率上的问题。实现上很简单,吧内存分成2块,使用的时候只用其中一块。当这一块内存满了的时候吧存活的对象复制到另一个内存块中。然后把之前的内存块全部清除了。
但是缺点也很明显一部门空间无法使用,存在空间浪费的情况,主要使用在新生代,新生代存活对象比较少每次只需要复制少量对象。
一般虚拟机的具体实现不会采用1:1的比例划分,以HotSpot为例,HotSpot虚拟机将内存分为一块较大的Eden空间和两块较小的 Survivor空间,每次分配内存只使用Eden和其中一块Survivor。发生垃圾搜集时,将Eden和Survivor中仍然存活的对象一次性复制到另外一块Survivor空间上,然后直接清理掉Eden和已用过的那块Survivor空间。默认Eden和Survivor的大小比例是8∶1。