1、串行
- 单线程
- 堆内存较小的时候,适合个人电脑
2、吞吐量优先
- 多线程
- 堆内存较大,多核CPU
- 我要在单位时间内,占用的stop the world占用的时间最短
- 0.2 + 0.2 ,虽然时间长,但是发生的次数少
3、响应时间优先
- 多线程
- 堆内存较大,多核CPU
- 注重垃圾回收的时候,让单次的stop the world的时间尽可能的短
- 0.1 + 0.1 + 0.1 + 0.1 + 0.1,即发生很多次,但是每次时间都很短
串行垃圾回收器
-XX:UseSerialGC = Serial + SerialOld
Serial 工作在新生代,采用标记复制算法
SerialOld 工作在老年代 采用标记整理算法
吞吐量优先
-XX:+UseParallelGC 新生代垃圾收集器,标记复制算法
-XX:+UsrParallelOldGC 老年代垃圾收集器,标记整理算法
这俩开启一个,默认开启另外一个
开启的垃圾回收线程的个数默认情况下与CPU核数有关,只要CPU核数小于8,就使用全部的CPU来用于垃圾回收,四核CPU我就用4个线程来完成回收,因为利用全部的CPU来完成垃圾回收,因此回收的时候CPU的占用率会达到几乎 100%。
响应时间优先
concurrent - Mark - sweep 基于标记清除的并发垃圾收集器
并发
垃圾回收器工作的同时,其他的用户线程也可以执行
并行
多个垃圾回收区并行运行,但不允许用户线程继续运行(stop the world)
当老年代内存不足,等线程都运行到安全点,暂停下来,会进行初始标记,初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,在期间会暂停用户线程。
初始标记结束之后,用户线程回复运行,GC线程进行并发标记,并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对 象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行。
此后进行重新标记,重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长一 些,但也远比并发标记阶段的时间短。重新标记也会暂停用户线程。
最后是并发清除阶段,清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象(标记清除算法),所以这个阶段也是可以与用户线程同时并发的。
CMS收集器对处理器资源非常敏感。
CMS是一款基于“标记-清除”算法实现的收集器,这意味着收集结束时会有大量空间碎片产生。空间碎片过多时,将会给大对象分配带来很大麻烦,往往会出现老年代还有很多剩余空间,但就是无法找到足够大的连续空间来分配当前对象,而不得不提前触发一次Full GC的情况。FullGC会进行空间的压缩,为了解决这个问题, CMS收集器提供了一个-XX:+UseCMS-CompactAtFullCollection开关参数(默认是开启的,此参数从 JDK 9开始废弃),用于在CMS收集器不得不进行Full GC时开启内存碎片的合并整理过程,由于这个内存整理必须移动存活对象,是无法并发的,这样空间碎片问题是解 决了,但停顿时间又会变长,因此虚拟机设计者们还提供了另外一个参数-XX:CMSFullGCsBeforeCompaction(此参数从JDK 9开始废弃),这个参数的作用是要求CMS收集器在执行过若干次(数量由参数值决定)不整理空间的Full GC之后,下一次进入Full GC前会先进行碎片整理(默认值为0,表 示每次进入Full GC时都进行碎片整理)