JVM垃圾回收算法
一、垃圾收集算法 1.1 标记-清除 首先标记处需要清理的对象,然后回收所有被标记的对象,缺点在于:空间碎片,标记清除后内存中仍存在地址不连续的对象(内存碎片),如果内存碎片过多,会导致为大对象分配空间时无可用空间,触发又一次的GC。 1.2 标记-整理 当标记完待回收对象后,让所有存活的对象都向一端移动,然后直接清理掉端边界意外的内存,**不是直接对可回收对象进行清理。**缺点是整理需要花费一定时间。 1.3 复制 复制算法将内存划分为相等的两块,每次只使用其中一块。当这一块内存用完时,就将还存活的对象复制到另一块上面,然后将已经使用过的内存空间一次清理掉。缺点是内存使用率降为一半,对象存活率较高时,需要多次进行复制操作,效率变低。 1.4 分代收集算法 新生代采用复制算法,在老年代采用“标记-清除”或者“标记-整理”算法。新生代分为Eden区和两个相同大小的Survivor区, 所有新创建的对象都分配在Eden区域中 。当Eden区域满后会触发minor GC,将Eden区仍然存活的对象复制到其中一个Survivor区域中,另外一个Survivor区中的存活对象也复制到这个Survivor区域中,并始终保持一个Survivor区是空的。 一般建议Young区地大小为整个堆的1/4 。下面分别展示了新生代初始化-->Young GC-->执行完毕时的状态。使用了复制算法