关于标记清除算法和标记整理算法:

如果清除垃圾后整理对象,则回收内存时更复杂,不移动则内存分配时更复杂,从垃圾收集的停顿时间来看,不移动对象停顿时间会更短,但是从整个程序的吞吐量来看,移动对象会更划算。所以,关注吞吐量的并行gc收集器使用标记整理算法,关注延迟的cms收集器则采用标记-清除算法的。

关于垃圾收集器:

Serial:

从jdk1.3开始出现。简单,高效,对于内存资源受限的环境,他是所有内存收集器中额外内存消耗最小的,对于单核处理器或者处理器核心较少的环境,Serial收集器由于没有线程交互的开销,专心做垃圾收集可以获得最高的单线程收集效率。适用于内存几十兆到百兆的情况。

ParNew收集器:

实质上是Serial收集器的多线程并行版本。可以和cms收集器一起用,cms是老年代用的收集器。ParNew收集器在单核心处理器的环境中,绝对不会比serial更好的效果,甚至由于存在线程交互的开销,该收集器在通过超线程技术实现的伪双核处理环境中都不能百分之百超越Serial。

parallel Scavenge 收集器:

新生代收集器,基于标记复制算法,该收集器的特点是关注吞吐量—用户代码运行时间/(用户代码运行时间+GC时间)

SerialOld

Serial收集器的老年代版本,单线程收集器,使用标记整理算法。

CMS收集器:

以获取最短回收停顿时间为目标的收集器,应用于互联网网站或者B/S架构的服务端,关注服务的响应速度。基于标记-清除算法。

基于标记-清除算法的收集器,都会存在内存碎片的问题。

G1收集器

开创了收集器面向局部收集的设计思路。希望实现控制停顿时间目的。G1划分了多个Region(独立区域),每个Region都可以根据需要,扮演新生代的eden,servivor或者老年代空间。G1将每个Region作为最小回收单元,因此可以避免整个Java堆中全区域的垃圾收集。让G1收集器去跟踪每个Region,并且计算需要的时间和空间大小,以便有限的时间获得尽可能高效的收集效率。默认停顿时间200MS。G1更耗费回收性能,一般6-8g以下,CMS更优。

关于对象分配和晋升问题: