10.垃圾回收算法
1.标记清除算法(Mark Sweep)
1.标记:在GC Root的引用链去找,看堆对象是否被引用,引用保留,未被引用对象进行标记
2.清除:将该对象的起始结束的地址记录在空闲的地址列表中,下次分配新对象时,就可以在空闲的地址列表中查找。
优点:速度快
缺点:容易形成内存碎片
2.标记整理(Mark Compact)
1.标记:在GC Root的引用链去找,看堆对象是否被引用,引用保留,未被引用对象进行标记
2.整理:将垃圾对象删除,可用对象向前移动
优点:没有内存碎片
缺点:由于整理的过程涉及对象的移动,导致效率降低
3.复制算法(Copy)
1.标记:将内存区域划分为两块大小相同的区域,存在对象的称为from,另外一个区域始终空闲称为to,标记from中垃圾对象和可用对象。
2.复制:将from区域中存活的对象复制到to区域,复制过程中完成碎片的整理,from区域只剩下垃圾对象,清空from区域
3.交换:交换from和to区域的位置
优点:不会产生内存碎片
缺点:占用双倍的内存空间
11.分代回收
老年代:长时间存在的java对象
新生代:频繁更迭的Java对象
伊甸园:存放刚创建的Java对象,
第一次伊甸园空间紧张时:触发Minor GC:标记伊甸园区对象,有用的复制到幸存区To,同时复制过去的对象,经历过一次GC寿命加一,原来伊甸园的对象被回收。完成一次Minor GC后,交换两个幸存区的位置,这个时候幸存区To为空,From存放对象。
第二次伊甸园紧张时,Minor GC会标记伊甸园和幸存区From中的有用对象,复制到幸存区To中,寿命加一,接下来,清除伊甸园和幸存区To空间,交换两个幸存区的位置,此时幸存区To为空,From存放对象。
Minor GC会引发stop the world,暂停其他用户的线程,等垃圾回收借宿,用户线程才会恢复运行。
当幸存区From的对象寿命达到一个阈值,一般是15(4bit)时,会晋升到老年代中。
当新生代和老年代空间紧张时,会先触发Minor GC,之后才会触发Full GC,同时STW(stop the world)时间更长。之后空间任然不够,就会抛出OutOfMemoryError。
12.相关的VM参数
1.当放入内存的对象太大,伊甸园不发容纳,不会触发GC直接放到老年代中。
2.outofmemoryerror并不会导致整个进程的结束