前言
在上篇中,我们把 JVM 中的垃圾收集算法有了一个大概的了解,又是一个阴雨连绵的周末,宅在家里的我们又开始了新一轮的学习:
产品大大:上周末我们说了垃圾收集算法,下面是不是要讲一下这些算法的应用呢?
我:当然,如果说垃圾收集算法是打狗棒法,那么垃圾收集器就是历届的丐帮帮主们,不同的帮主领悟到的自然也就不同,我先对这些帮主进行一个简单的介绍,看图!
我:我从回收的区域去对垃圾收集器进行了一个简单的划分,大致可以分为这样九种,下面就且听我为你一一道来。
产品大大:好哒
Serial 收集器
我:下面要说的就是一款非常古老的「新生代收集器」—— Serial 收集器,它的历史可以追溯到 JDK 还是以1.x命名的时代(大概时间在我五岁的时候?
产品大大:从 Serial 这个名字上可以看的出,这应该是一款串行(单线程)收集器,对吧?
我:没错,Serial 收集器是一款单线程的收集器,它的收集过程也很简单(如下图),虽然它只会使用一个处理器或一条线程去收集垃圾,但是这里我不喜欢称之为单线程收集器,它更适合「串行」这个词,因为它在进行 GC 的时候,必须暂停掉其他的线程(Stop The World,STW)
产品大大:那么这个收集器是不是已经废弃掉了啊,仅仅停留在历史中,作为一个值得去纪念的东西?
我:其实也并不能这么说,虽然它简单,但是简单有简单的好处,因为单线程,所以没有切换线程的资源开销,所以在单核CPU的环境下,它的表现反而会显得更加优秀,只能说是没有最好的收集器,只有最适合的收集器~
产品大大:酱紫哦,那么我们来说下一个收集器吧,这个我已经有一个大概的了解了~
ParNew 收集器
我:下一个收集器啊,叫做 ParNew 收集器,这个收集器和上面我们所说的 Serial 收集器基本上一模一样,除了它会启动多个GC线程去进行垃圾的收集(并行收集)
产品大大:并行?我只听过并发哦。。
我:并发指的是工作线程与垃圾收集线程之间的关系,而并行指的是多条垃圾收集线程之间的关系,这两个的概念是不一样的,并行的时候,工作线程处于等待状态。而并发的时候,工作线程处于活动状态。
产品大大:那么它和 Serial 收集器比起来有什么区别呢?