GC四种算法的实现 Java10以前
新生代和老年代适用的垃圾回收器:
其中,新生代收集器激活,老年代也会被默认激活相应的。如下图:
不再推荐的:
Parallel Scavenge的特点: 主要是吞吐量
Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。
主要的垃圾收集器:
1.serial 串行回收
它为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所有的用户线程。
2.parallel 并行回收 Java8默认回收器
程序中间也要停,等待垃圾收集
3.CMS 并发标记清除(ConcMarkSweep)
用户线程和垃圾收集线程同时执行(不一定并行,可能交替执行),不需要停顿用户线程。希望系统停顿时间最短,重视服务器的响应速度。牺牲吞吐量
标记的是可达对象即存活对象,清除其他的。
其中,serial Old将作为CMS出错的后备收集器
运行的四个阶段:
(1)初始标记,只是标记一下GC Roots能直接关联的对象,速度很快,仍然需要暂停所有的工作线程;(2)并发标记,进行GC Roots跟踪的过程,和用户线程一起工作,不需要暂停工作线程。主要标记过程,标记全部对象;(3)重新标记,为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有的工作线程。(4)并发清除,清除GC Roots不可达对象,和用户线程一起,不需要暂停工作线程。
由于耗时最长的并发标记和并发清除中是和用户一起并发工作的,所以看作是并发执行的。缺点就是由于并发导致CPU资源压力大,而且产生大量内存碎片。
缺点1:
由于GC和工作一起进行会增大堆空间,导致利用率降低。
缺点2:
4.G1
将堆内存分割成不同区域然后并发的对其进行垃圾回收,是一款面向服务端应用的收集器。
主要优点:(1)去除内存碎片;(2)暂停时间可控;
G1的特点:
最大好处是化整为零,避免全内存扫描,只需要按照区域来进行扫描即可。
超大对象直接进入养老区
回收步骤: