年轻代垃圾回收器ParNew
新生代的辣鸡回收器ParNew,主打的就是多线程回收
另外一种Serial垃圾回收器,主打的是单线程回收
回收算法一样
当ParNew垃圾回收器,在合适的时机进行垃圾回收的时候
会暂停当前的工作线程
让自己的垃圾线程去回收垃圾
如何为系统指定ParNew垃圾回收器
使用“-XX:+UseParNewGC”
只要加入这个选项,JVM启动之后对新生代进行垃圾回收的,就是ParNew垃圾回收器了
ParNew默认线程数量
它默认的线程数量是和机器的cpu核数是一样的
例如我们的机器是4核、8核、16核
对应的线程就是4个线程、8个线程、16个线程
也可以自己手动设置,使用“-XX:ParallelGCThreads”参数即可,通过他可以设置线程的数量
老年代垃圾回收器CMS
一般老年代垃圾回收器采用的垃圾回收算法是标记清理算法
标记出存活的对象,然后对垃圾对象进行清理
这种算法最大的问题是会造成内存碎片
如果先Stop the World 再进行垃圾清理会怎么样
如果停止一切工作线程,然后慢慢的去执行“标记-清理”算法,会导致系统卡死时间过长,很多响应无法处理
所以CMS采用的是垃圾回收线程和工作线程尽量同时进行的模式来处理的
CMS如何实现一边工作一边清理的
CMS在执行垃圾回收的时候有4个阶段
初始标记
【
CMS要进行垃圾回收时,会先执行初始标记阶段,这个阶段会让系统的工作线程全部停止,进入“Stop the World”状态
初始标记就是说标记出来所有GC Roots直接引用的对象
】
并发标记
【
这个阶段会让系统线程可以随意创建各种新对象,继续运行
在运行期间可能会创建新的存活对象,也可能会让部分存活对象失去引用,变成垃圾对象
在这个过程中,垃圾回收线程,会尽可能的对已有的对象进行GC Roots追踪
对老年代所有对象进行GC Roots追踪,其实是最耗时的
】
重新标记
【
要继续让系统程序停下来,再次进入“Stop the World”阶段
然后重新标记下在第二阶段里新创建的一些对象,还有一些已有对象可能失去引用变成垃圾的情况
这个重新标记的阶段,是速度很快的,他其实就是对在第二阶段中被系统程序运行变动过的少数对象进行标记,所以运行速度很快
】
并发清理
【
这个阶段恢复系统程序的运行
然后他来清理掉之前标记为垃圾的对象即可
这个阶段其实是很耗时的,因为需要进行对象的清理,但是他也是跟系统程序并发运行的,所以其实也不影响系统程序的执行
】
CMS垃圾回收性能
第二阶段和第四阶段,都是和系统程序并发执行的,所以基本这两个最耗时的
第一阶段和第三阶段是需要“Stop the World”的,但是这两个阶段都是简单的标记而已,速度非常的快