某方國信是一家外包公司,面試過程蠻順利的,但是被問到ParNew收集器時,我回答不出來,是以面試又挂了。垃圾收集器很多,這是我的弱項,我一個都沒看過,是以抽時間我會去整理學習這一塊内容。
ParNew收集器
首先要記住總共有幾種垃圾收集器。算到JDK9的話,答案是7種(兩種G1合并為一種)。我整理出一個表格:
分代 | 收集器 | 激活參數 |
Young | Copy | -XX:+UseSerialGC |
PS Scavenge | -XX:+UseParallelGC | |
ParNew | -XX:+UseParNewGC | |
G1 Young Generation | -XX:+UseG1GC | |
Old | MarkSweepCompact | -XX:+UseSerialGC |
PS MarkSweep | -XX:+UseParallelOldGC | |
ConcurrentMarkSweep | -XX:+UseConcMarkSweepGC | |
G1 Mixed Generation | -XX:+UseG1GC |
從表中可以看出ParNew是新生代收集器,全稱為Parallel New收集器,實際上是Copy收集器(也叫Serial收集器)的并行版,可以利用多核CPU的多個核進行并行收集。其算法和Copy收集器一樣在安全點,暫停所有使用者線程,采用标記-複制算法。
ParNew最好和和老年代的CMS配合使用。在JDK8中ParNew和MarkSweepCompact配合的方式已經被廢棄,而JDK9已經不允許這樣配合了。等于是說JDK7中新生代Serial、ParNew和老年代的CMS、MarkSweepCompact可以任意組合。JDK9呢,Serial隻能配合MarkSweepCompact(啟動都是-XX:+UseSerialGC),ParNew隻能配合CMS收集器。但是JDK8采用了一種中間方案,廢棄不建議的組合。