解讀JDK1.8?默認(rèn)使用什么垃圾收集器
JDK1.8 默認(rèn)使用什么垃圾收集器
使用java -XX:+PrintCommandLineFlags -version查看一下
-XX:InitialHeapSize=132500864 //初始堆大小 -XX:MaxHeapSize=2120013824 ? ?//最大堆大小 -XX:+PrintCommandLineFlags ? ?//程序運(yùn)行前打印出用戶手動(dòng)設(shè)置或者JVM自動(dòng)設(shè)置的XX選項(xiàng),因?yàn)槲覀儓?zhí)行時(shí)間加上了這個(gè)選項(xiàng),所以這里會(huì)打印出來 -XX:+UseCompressedClassPointers // 默認(rèn)開啟類指針壓縮 -XX:+UseCompressedOops ?// 默認(rèn)開啟對(duì)象指針壓縮 -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虛擬機(jī),Server模式,混合編譯
或者使用java -XX:+PrintFlagsFinal 查看亦可。可以看到UseParellelGC和UseParellelOldGC兩個(gè)選項(xiàng)都是打開的,即JDK1.8中默認(rèn)使用的是Parallel Scavenge和Parallel Old收集器組合。
我可也可以寫一個(gè)堆溢出的小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)垃圾回收器的組合
問題是什么?
線上運(yùn)行的項(xiàng)目,在不指定jvm運(yùn)行參數(shù)的情況下,默認(rèn)的垃圾回收器的組合是什么?
針對(duì)網(wǎng)上一大堆的介紹,個(gè)人覺得可能是我自己沒有理解吧,總感覺有一些問題,或者欠缺點(diǎn)什么?
網(wǎng)上的言論大體上有一下兩種:
- ps + po
- ps + so
究竟哪個(gè)是正確的呢?
答案是:ps + po
驗(yàn)證
我這里有幾個(gè)java進(jìn)程
[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運(yùn)行參數(shù)為:-XX:+UseParallelGC,查看周志明老師深入理解java虛擬機(jī)中關(guān)于垃圾回收器的介紹來看,這個(gè)參數(shù)對(duì)應(yīng)的垃圾回收器的組合應(yīng)該為:ps + so(紅色框選中的部分)
乍一看!這是為什么呢,不是說默認(rèn)的是ps + po么?
這就涉及到j(luò)dk版本的問題了,可以看看參考資料里面的描述:大致意思就是在jdk1.8以后-XX:+UseParallelGC是默認(rèn)開啟的,所以垃圾回收器的組合就是ps+po,但是為什么命令行的顯示來看這個(gè)參數(shù)沒有被指定呢?這個(gè)。。。。。不懂,留著后面再看吧!
我們也可以用下面的指令來查看,現(xiàn)在想想這個(gè)應(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這個(gè)就是po的垃圾回收器了,所以默認(rèn)情況下jdk1.8的默認(rèn)垃圾回收器的組合為:ps+po!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(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實(shí)現(xiàn)互斥鎖
當(dāng)我們利用Redis存儲(chǔ)熱點(diǎn)數(shù)據(jù)時(shí),突然就過期失效或者被刪除了,導(dǎo)致大量請(qǐng)求同時(shí)訪問數(shù)據(jù)庫,增加了數(shù)據(jù)庫的負(fù)載,為減輕數(shù)據(jù)庫的負(fù)載我們利用互斥鎖,本文重點(diǎn)介紹在SpringBoot中如何利用Redis實(shí)現(xiàn)互斥鎖,感興趣的朋友一起看看吧2023-09-09SpringBoot使用redis實(shí)現(xiàn)session共享功能
這篇文章主要介紹了pringboot項(xiàng)目使用redis實(shí)現(xiàn)session共享,文中通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-05-05java生成申請(qǐng)單序列號(hào)的實(shí)現(xiàn)方法
申請(qǐng)單序列號(hào)一般要求根據(jù)一定的規(guī)則生成后幾位連續(xù)的字符串,下面是我項(xiàng)目中使用的生成序列號(hào)的代碼,其中用到了鎖機(jī)制,有需要的朋友可以參考一下2014-01-01