目录
串行/并行回收器
这篇日志把JVM使用的G1回收器总结一下,在JVM支持的垃圾回收器中,有串行和并行回收器,串行回收器就是使用单一线程来进行垃圾回收,例如新生代串行回收器在进行垃圾回收时会停止整个Java程序的运行,因为单线程没有线程之间的切换,而且使用的是使用的复制算法,只需把可回收对象复制到其他空间,然后清除原来空间即可,整个回收过程效率较高(新生代区中因为可达的对象较少,可回收对象较多,所以使用复制算法将较少的存活对象复制后直接清除大量垃圾对象,效率高)。还有老年代串行回收器,同样是单线程执行,且垃圾回收过程中会暂停整个程序,和新生代串行回收器不同的是,老年代串行回收使用的是标记压缩法,因为老年代区中存活的对象较多,可回收对象较少,如果使用复制算法的话,需要进行大量的复制操作,所以使用标记压缩法较好,简单来说就是先从根结点开始遍历一遍所有的对象,记录它们的可达性,然后将所有可回收的对象压缩到内存的一端,进行保证内存空间连续,减少内存碎片,然后把其他垃圾对象清除。
有串行回收肯定也有并行回收,现在的CPU基本都是双核以上,多线程同时进行垃圾回收,整个程序的运行效率通常比串行回收高,哪怕串行回收器的效率再快。并行新生代回收器和串行使用的一样是复制算法,只是使用多线程方式,执行过程还是会阻塞程序执行,并行的老年代回收器等在这里不详细总结。