日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 架構(gòu)師社區(qū)
[導(dǎo)讀]來(lái)自:碼匠筆記 JDK 8 到底默認(rèn)用的是哪款 GC 收集器? 為啥是 JDK8?不是 9 也不是 10?因?yàn)?JDK8 還是市場(chǎng)占有率最高的,所以針對(duì)這個(gè)版本我做了深入的探索。 《深入理解 Java 虛擬機(jī)》第三版第 128 頁(yè)中提到 JDK 9 之前,Server 默認(rèn)使用 Parallel Scaveng


來(lái)自:碼匠筆記

JDK 8 到底默認(rèn)用的是哪款 GC 收集器?

為啥是 JDK8?不是 9 也不是 10?因?yàn)?JDK8 還是市場(chǎng)占有率最高的,所以針對(duì)這個(gè)版本我做了深入的探索。

《深入理解 Java 虛擬機(jī)》第三版第 128 頁(yè)中提到 JDK 9 之前,Server 默認(rèn)使用 Parallel Scavenge + Serial Old(PS MarkSweep),那么真的是這樣的嗎? 我?guī)е@個(gè)疑問(wèn)做了如下驗(yàn)證

  1. 直接使用命令查看一下當(dāng)前 JVM 默認(rèn)參數(shù)
java -XX:+PrintCommandLineFlags -version

輸入內(nèi)容如下

-XX:InitialHeapSize=268435456 
-XX:MaxHeapSize=4294967296 
-XX:+PrintCommandLineFlags 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:+UseParallelGC
java version "1.8.0_162" Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)

第 6 行我們可以看到使用的是 -XX:+UseParallelGC按照書(shū)中或者是網(wǎng)上的文章發(fā)現(xiàn),設(shè)置這個(gè)參數(shù)以后默認(rèn)就是如下兩個(gè)組合,新生代用 Parallel Scavenge老年代用 Serial Old

Parallel Scavenge + Serial Old

那么這里再詳細(xì)科普一下,下面是每個(gè)參數(shù)對(duì)應(yīng)的回收器的類型

參數(shù) 回收器
-XX:-UseSerialGC Serial + Serial Old
-XX:-UseParNewGC ParNew + Serial Old
-XX:-UseParallelGC Parallel Scavenge + Serial Old
-XX:-UseParallelOldGC Parallel Scavenge + Parallel Old
-XX:-UseConcMarkSweepGC CMS + ParNew
-XX:-UseG1GC G1

將信將疑的我再次開(kāi)啟探索之旅,這時(shí)候我使用 ManagementFactory.getGarbageCollectorMXBeans()把具體的回收器打印出來(lái)看下不就可以了嗎?詳細(xì)代碼如下

import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; import java.util.List; public class GcCollectorPrinter { public static void main(String[] args) {
        Listbeans = ManagementFactory.getGarbageCollectorMXBeans(); for (GarbageCollectorMXBean bean : beans) {
            System.out.println(bean.getName());
        }
    }
}

直接運(yùn)行輸出內(nèi)容如下

PS Scavenge
PS MarkSweep

這意思是 PS MarkSweep是 Serial Old的意思對(duì)嗎?那么 -XX:+UseParallelOldGC打印出來(lái)的結(jié)果又是什么呢?我配置好參數(shù)再次運(yùn)行如下兩個(gè)命令

javac GcCollectorPrinter.java 
java -XX:+UseParallelOldGC GcCollectorPrinter

如下是打印結(jié)果

PS Scavenge
PS MarkSweep

等等,我更加疑惑了?-XX:+UseParallelOldGC和  -XX:+UseParallelGC的輸出結(jié)果都是 PS MarkSweep,那么他究竟是 Serial Old還是 Parallel Old?
這時(shí)候我有兩個(gè)猜想

  1. PS MarkSweep只是回收器的別名,他可以指代 Serial Old和 Parallel Old,畢竟他們的實(shí)現(xiàn)基本一樣。
  2. -XX:+UseParallelGC和 -XX:+UseParallelOldGC結(jié)果一樣,都是用的 Parallel Old

好的那么接下來(lái)開(kāi)啟 GC 之旅,這個(gè)"別名"一樣沒(méi)辦法了,我直接打印一下 GC 的日志,看下日志里面顯示什么,-XX:+PrintGCDetails這個(gè)參數(shù)就上場(chǎng)了,他可以輸出 GC 詳細(xì)的分區(qū)分析,我們?cè)俅芜\(yùn)行剛才的兩個(gè)例子如下

java -XX:+UseParallelOldGC -XX:+PrintGCDetails GcCollectorPrinter
java -XX:+PrintGCDetails GcCollectorPrinter

結(jié)果驚人的一致

PS Scavenge
PS MarkSweep
Heap
 PSYoungGen      total 76288K, used 3932K [0x000000076ab00000, 0x0000000770000000, 0x00000007c0000000)
  eden space 65536K, 6% used [0x000000076ab00000,0x000000076aed7240,0x000000076eb00000)
  from space 10752K, 0% used [0x000000076f580000,0x000000076f580000,0x0000000770000000)
  to   space 10752K, 0% used [0x000000076eb00000,0x000000076eb00000,0x000000076f580000)
 ParOldGen       total 175104K, used 0K [0x00000006c0000000, 0x00000006cab00000, 0x000000076ab00000)
  object space 175104K, 0% used [0x00000006c0000000,0x00000006c0000000,0x00000006cab00000)
 Metaspace       used 2729K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 297K, capacity 386K, committed 512K, reserved 1048576K

可以看到 老年代都是用的 ParOldGen那么一點(diǎn)可以斷定了,-XX:+UseParallelGC和 -XX:+UseParallelOldGC結(jié)果一樣,都是用的 Parallel Old。

那么我們繼續(xù)驗(yàn)證第二個(gè)疑問(wèn),PS MarkSweep只是回收器的別名,他可以指代 Serial Old和 Parallel Old,可以直接使用如下命令驗(yàn)證,我用的不是+而是-,這樣就一定強(qiáng)制去掉了 Parallel Old收集器,我們看下效果

java -XX:-UseParallelOldGC -XX:+PrintGCDetails GcCollectorPrinter
PS Scavenge
PS MarkSweep
Heap
 PSYoungGen      total 76288K, used 3932K [0x000000076ab00000, 0x0000000770000000, 0x00000007c0000000)
  eden space 65536K, 6% used [0x000000076ab00000,0x000000076aed7240,0x000000076eb00000)
  from space 10752K, 0% used [0x000000076f580000,0x000000076f580000,0x0000000770000000)
  to   space 10752K, 0% used [0x000000076eb00000,0x000000076eb00000,0x000000076f580000)
 PSOldGen        total 175104K, used 0K [0x00000006c0000000, 0x00000006cab00000, 0x000000076ab00000)
  object space 175104K, 0% used [0x00000006c0000000,0x00000006c0000000,0x00000006cab00000)
 Metaspace       used 2728K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 297K, capacity 386K, committed 512K, reserved 1048576K

唯一的變化就是 ParOldGen換成了 PSOldGen,經(jīng)過(guò)查詢我們可以確定 PSOldGen就是  Serial Old所以終于有了答案。

  1. PS MarkSweep只是回收器的別名,他可以指代 Serial Old和 Parallel Old。
  2. -XX:+UseParallelGC和 -XX:+UseParallelOldGC結(jié)果一樣,都是用的 Parallel Old

那書(shū)上說(shuō)的還能有假?保險(xiǎn)起見(jiàn)還是去找一些資料吧

在 JDK 8 的官網(wǎng)找到了一些蛛絲馬跡
鏈接:https://urlify.cn/67NnEz

Parallel compaction is enabled by default if the option -XX:+UseParallelGC has been specified. The option to turn it off is -XX:-UseParallelOldGC.

大致意思就是說(shuō)-XX:+UseParallelGC就會(huì)開(kāi)始 Parallel收集器除非手動(dòng)關(guān)閉,那么可是書(shū)上為什么說(shuō)是 Serial呢?

終于我在 JDK 源碼 commit 記錄里面找到了答案,在 JDK 7U4 之前確實(shí) UserParallelGC用的就是 Serial,在這個(gè)版本之后 Parallel已經(jīng)很成熟了,所以直接替換了舊的收集器,所以 JDK 7u4 以后的 7 和 JDK 8 老年代默認(rèn)使用的都是 Parallel收集器,只是書(shū)中沒(méi)有更新這個(gè)細(xì)節(jié)。
網(wǎng)址:
https://bugs.openjdk.java.net/browse/JDK-6679764
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/rev/24cae3e4cbaa
原文:

Server-class machine ergonomics was introduced in jdk5. If the machine upon which
the jvm is running is powerful enough (currently, at least 2 physical cores plus
at least 2gb of memory), the server jvm is invoked using the parallel scavenger
rather than the serial scavenger. Currently the old gen collector used is
serial mark-sweep-compact. Now that the parallel old gen collector is mature,
we should change to using it instead.
Issue Links


特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒(méi)關(guān)注的小伙伴,可以長(zhǎng)按關(guān)注一下:

原來(lái)書(shū)中說(shuō)的JVM默認(rèn)垃圾回收器是錯(cuò)的!

長(zhǎng)按訂閱更多精彩▼

原來(lái)書(shū)中說(shuō)的JVM默認(rèn)垃圾回收器是錯(cuò)的!

如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉