解讀JDK1.8?默認(rèn)使用什么垃圾收集器
JDK1.8 默認(rèn)使用什么垃圾收集器
使用java -XX:+PrintCommandLineFlags -version查看一下
-XX:InitialHeapSize=132500864 //初始堆大小 -XX:MaxHeapSize=2120013824 ? ?//最大堆大小 -XX:+PrintCommandLineFlags ? ?//程序運行前打印出用戶手動設(shè)置或者JVM自動設(shè)置的XX選項,因為我們執(zhí)行時間加上了這個選項,所以這里會打印出來 -XX:+UseCompressedClassPointers // 默認(rèn)開啟類指針壓縮 -XX:+UseCompressedOops ?// 默認(rèn)開啟對象指針壓縮 -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC // 默認(rèn)使用Parallel垃圾收集器 java version "1.8.0_221" // jdk版本 Java(TM) SE Runtime Environment (build 1.8.0_221-b11) // jre Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode) // Hotspot虛擬機,Server模式,混合編譯
或者使用java -XX:+PrintFlagsFinal 查看亦可。可以看到UseParellelGC和UseParellelOldGC兩個選項都是打開的,即JDK1.8中默認(rèn)使用的是Parallel Scavenge和Parallel Old收集器組合。
我可也可以寫一個堆溢出的小demo打印GC信息:
PSYoungGen total 6144K, used 3224K [0x00000000ff980000, 0x0000000100000000, 0x0000000100000000)
eden space 5632K, 57% used [0x00000000ff980000,0x00000000ffca6230,0x00000000fff00000)
from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
to space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
ParOldGen total 13824K, used 13440K [0x00000000fec00000, 0x00000000ff980000, 0x00000000ff980000)
object space 13824K, 97% used [0x00000000fec00000,0x00000000ff920338,0x00000000ff980000)
Metaspace used 2681K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 286K, capacity 386K, committed 512K, reserved 1048576K
PSYoungGen 表示的是由Parallel Scavenge垃圾收集器管理的新生代,ParOldGen表示由Parallel Old管理的老年代。
jdk1.8默認(rèn)垃圾回收器的組合
問題是什么?
線上運行的項目,在不指定jvm運行參數(shù)的情況下,默認(rèn)的垃圾回收器的組合是什么?
針對網(wǎng)上一大堆的介紹,個人覺得可能是我自己沒有理解吧,總感覺有一些問題,或者欠缺點什么?
網(wǎng)上的言論大體上有一下兩種:
- ps + po
- ps + so
究竟哪個是正確的呢?
答案是:ps + po
驗證
我這里有幾個java進程
[root@Game-TEST ~ 00:47:06]# jps 14576 CrossFamilyTopServerStart 14352 Start 1797 jar [root@Game-TEST ~ 00:47:25]# jinfo -flags 14352 Attaching to process ID 14352, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.121-b13 Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=264241152 -XX:MaxHeapSize=4217372672 -XX:MaxNewSize=1405616128 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=88080384 -XX:OldSize=176160768 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
可以看到這里默認(rèn)的jvm運行參數(shù)為:-XX:+UseParallelGC,查看周志明老師深入理解java虛擬機中關(guān)于垃圾回收器的介紹來看,這個參數(shù)對應(yīng)的垃圾回收器的組合應(yīng)該為:ps + so(紅色框選中的部分)
乍一看!這是為什么呢,不是說默認(rèn)的是ps + po么?
這就涉及到j(luò)dk版本的問題了,可以看看參考資料里面的描述:大致意思就是在jdk1.8以后-XX:+UseParallelGC是默認(rèn)開啟的,所以垃圾回收器的組合就是ps+po,但是為什么命令行的顯示來看這個參數(shù)沒有被指定呢?這個。。。。。不懂,留著后面再看吧!
我們也可以用下面的指令來查看,現(xiàn)在想想這個應(yīng)該是最直接的!
[root@Game-TEST ~ 00:55:50]# java -XX:+PrintGCDetails -version java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) Heap PSYoungGen total 75264K, used 2580K [0x000000076c380000, 0x0000000771780000, 0x00000007c0000000) eden space 64512K, 4% used [0x000000076c380000,0x000000076c605368,0x0000000770280000) from space 10752K, 0% used [0x0000000770d00000,0x0000000770d00000,0x0000000771780000) to space 10752K, 0% used [0x0000000770280000,0x0000000770280000,0x0000000770d00000) ParOldGen total 172032K, used 0K [0x00000006c4a00000, 0x00000006cf200000, 0x000000076c380000) object space 172032K, 0% used [0x00000006c4a00000,0x00000006c4a00000,0x00000006cf200000) Metaspace used 2216K, capacity 4480K, committed 4480K, reserved 1056768K class space used 243K, capacity 384K, committed 384K, reserved 1048576K
出現(xiàn)了ParOldGen這個就是po的垃圾回收器了,所以默認(rèn)情況下jdk1.8的默認(rèn)垃圾回收器的組合為:ps+po!
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Kotlin基礎(chǔ)教程之Run,標(biāo)簽Label,函數(shù)Function-Type
這篇文章主要介紹了Kotlin基礎(chǔ)教程之Run,標(biāo)簽Label,函數(shù)Function-Type的相關(guān)資料,需要的朋友可以參考下2017-05-05在SpringBoot中如何利用Redis實現(xiàn)互斥鎖
當(dāng)我們利用Redis存儲熱點數(shù)據(jù)時,突然就過期失效或者被刪除了,導(dǎo)致大量請求同時訪問數(shù)據(jù)庫,增加了數(shù)據(jù)庫的負(fù)載,為減輕數(shù)據(jù)庫的負(fù)載我們利用互斥鎖,本文重點介紹在SpringBoot中如何利用Redis實現(xiàn)互斥鎖,感興趣的朋友一起看看吧2023-09-09SpringBoot使用redis實現(xiàn)session共享功能
這篇文章主要介紹了pringboot項目使用redis實現(xiàn)session共享,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-05-05