分类:
- 串行
- 吞吐量优先
- 响应时间优先
详细介绍:
1.串行
- 单线程
- 堆内存较小,适合个人电脑
- 开启串行垃圾回收器的jvm参数:-XX:+UseSerialGC = Serial(新生代复制算法) + SerialOld(老年代标记整理算法 )
注:在一个进程进行垃圾回收时,要在一个安全点阻塞其他进程,进行一次stop the world,因为对象回收时,会涉及到对象移动,引用的地址会改变。
2.吞吐量优先
- 多线程
- 堆内存较大,多核cpu
- 目标:让单位时间内,stw的时间最短(单位时间内的总stw时间最短)
- 开启吞吐量优先的垃圾回收器JVM参数:-XX:+UseParallerlGC~-XX:+UseParallelOldGC
注:
内存不足,触发垃圾回收时,多个线程在一个安全点暂停,多个线程开始垃圾回收。垃圾回收线程的个数,默认和电脑的CPU核数一致。并且线程数可以通过JVM参数进行设置(-XX:ParallelGCThreads=n)
3.响应时间优先
- 多线程
- 堆内存较大,多核cpu
- 目标:尽可能的让单次stw时间最短(单次stw时间最短,但单位时间内可能发生很多次stw,总stw时间未必最短)
- 开启响应时间优先的垃圾回收器JVM参数:-XX:+UseConcMarkSweepGC~-XX:+UseParNewGC~SerialOld
- 特点:用户线程和垃圾回收线程并发执行(可以干不同的事,减少了stw的时间),是一款工作在老年代的垃圾回收器,与之配合的事-XX:UseParNewGC工作在新生代的垃圾回收器。考虑到并发失败的问题,采取的补救措施是,让CMS垃圾回收器退化成单线程的SerialOld垃圾回收器(基于标记整理的老年代回收器)
注:
如上图,老年代内存不足,进行垃圾回收。CMS垃圾回收器进行初始标记(时间很快,只标记根对象),此时仍然需要stop the world,其他线程阻塞,标记完成后,用户线程可以继续运行,垃圾回收线程此时可以并发标记,把剩余的垃圾找出来,不需要stop the world。由于并发标记以后,可能改变了对象的引用,所以并行标记以后要进行重新标记需要stw,然后用户线程可以重新运行,垃圾回收进程可以进行并发清理。