一张PDF了解JDK10 GC调优秘籍-附PDF下载
文章目錄
- 簡(jiǎn)介
- Java參數(shù)類型
- Large Pages
- JIT調(diào)優(yōu)
- 總結(jié)
簡(jiǎn)介
今天我們講講JDK10中的JVM GC調(diào)優(yōu)參數(shù),JDK10中JVM的參數(shù)總共有1957個(gè),其中正式的參數(shù)有658個(gè)。
其實(shí)JDK10跟JDK9相比沒有太大的變化,一個(gè)我們可以感受到的變化就是引入了本地變量var。
為了方便大家的參考,特意將JDK10中的GC參數(shù)總結(jié)成了一張PDF,這個(gè)PDF在之前的JDK9的基礎(chǔ)上進(jìn)行了增減和修正,歡迎大家下載。
Java參數(shù)類型
其實(shí)Java參數(shù)類型可以分為三類。
第一類叫做標(biāo)準(zhǔn)的java參數(shù)。
這一類參數(shù)是被所有的JVM實(shí)現(xiàn)所支持的,是一些非常常用的JVM參數(shù)。
我們可以通過直接執(zhí)行java命令來查看。
第二類叫做額外的java參數(shù),這些參數(shù)是專門為Hotspot VM準(zhǔn)備的,并不保證所有的JVM都實(shí)現(xiàn)了這些參數(shù)。并且這些參數(shù)隨時(shí)有可能被修改。 額外的java參數(shù)是以 -X開頭的。
我們可以通過java -X來查看。
第三類叫做高級(jí)參數(shù)。這些參數(shù)是開發(fā)者選項(xiàng),主要作用就是JVM調(diào)優(yōu)。這些參數(shù)和第二類參數(shù)一樣,也是不保證被所有的JVM支持的,并且隨時(shí)都可能變化。
第三類參數(shù)是以-XX開頭的,我們可以通過java -XX:+PrintFlagsFinal來查看。
神奇的是,我們做JVM調(diào)優(yōu)的參數(shù)往往就是這第三類參數(shù),所以,下次如果再有面試官問你JVM調(diào)優(yōu),你可以直接懟回去:這些參數(shù)是不被官方推薦普通使用者使用的,并且隨時(shí)都可能變化。沒必要掌握!那么這個(gè)Offer肯定非你莫屬。
Large Pages
其實(shí)JDK10跟JDK9相比沒啥大的變化,這里重點(diǎn)講解一個(gè)特性叫做Large Pages。
Large pages其實(shí)不是JDK10的新特性了,它的歷史已經(jīng)很久了。
在講large Pages之前,我們先講一下內(nèi)存分頁(yè)。
CPU是通過尋址來訪問內(nèi)存空間的。一般來說CPU的尋址能力是有限的。而實(shí)際的物理內(nèi)存地址會(huì)遠(yuǎn)大于CPU的尋址范圍。
為了解決這個(gè)問題,現(xiàn)代CPU引入了MMU(Memory Management Unit 內(nèi)存管理單元)和虛擬地址空間的概念。
虛擬地址空間也叫做(Virtual address space),為了不同程序的互相隔離和保證程序中地址的確定性,現(xiàn)代計(jì)算機(jī)系統(tǒng)引入了虛擬地址空間的概念。簡(jiǎn)單點(diǎn)講可以看做是跟實(shí)際物理地址的映射,通過使用分段或者分頁(yè)的技術(shù),將實(shí)際的物理地址映射到虛擬地址空間。
同時(shí)為了解決虛擬空間比物理內(nèi)存空間大的問題,現(xiàn)代計(jì)算機(jī)技術(shù)一般都是用了分頁(yè)技術(shù)。
分頁(yè)技術(shù)就是將虛擬空間分為很多個(gè)page,只有在需要用到的時(shí)候才為該page分配到物理內(nèi)存的映射,這樣物理內(nèi)存實(shí)際上可以看做虛擬空間地址的緩存。
虛擬地址空間和物理地址的映射是通過一個(gè)叫做映射存儲(chǔ)表的地方來工作的。這個(gè)地方一般被叫做頁(yè)表(page table),頁(yè)表是存儲(chǔ)在物理內(nèi)存中的。
CPU讀取物理內(nèi)存速度肯定會(huì)慢于讀取寄存器的速度。于是又引入了TLB的概念。
Translation-Lookaside緩沖區(qū)(TLB)是一個(gè)頁(yè)面轉(zhuǎn)換緩存,其中保存了最近使用的虛擬到物理地址轉(zhuǎn)換。
TLB容量是有限的。如果發(fā)生TLB miss則需要CPU去訪問內(nèi)存中的頁(yè)表,從而造成性能損耗。
通過調(diào)大內(nèi)存分頁(yè)大小,單個(gè)TLB條目存儲(chǔ)更大的內(nèi)存范圍。這將減少對(duì)TLB的壓力,并且對(duì)內(nèi)存密集型應(yīng)用程序可能具有更好的性能。
但是,大頁(yè)面也可能會(huì)對(duì)系統(tǒng)性能產(chǎn)生負(fù)面影響。例如,當(dāng)應(yīng)用程序使用大量大頁(yè)面內(nèi)存時(shí),可能會(huì)導(dǎo)致常規(guī)內(nèi)存不足,并導(dǎo)致其他應(yīng)用程序中的過多分頁(yè),并使整個(gè)系統(tǒng)變慢。同樣,長(zhǎng)時(shí)間運(yùn)行的系統(tǒng)可能會(huì)產(chǎn)生過多的碎片,這可能導(dǎo)致無法保留足夠大的頁(yè)面內(nèi)存。發(fā)生這種情況時(shí),OS或JVM都會(huì)恢復(fù)為使用常規(guī)頁(yè)面。
Oracle Solaris, Linux, and Windows Server 2003 都支持大頁(yè)面。
具體各個(gè)系統(tǒng)的large page的配置,大家可以自行探索。
JIT調(diào)優(yōu)
JIT我在之前的文章中介紹過很多次了,為了提升java程序的執(zhí)行效率,JVM會(huì)將部分熱點(diǎn)代碼,使用JIT編譯成為機(jī)器碼。
那么JIT的調(diào)試參數(shù)也是非常重要的。這里具體講解一些比較常用JIT調(diào)試指令:
-XX:+BackgroundCompilation使用后臺(tái)編譯,也就是說編譯線程和前臺(tái)線程使用是不同的線程。一般來說如果我們需要調(diào)試JIT日志的話,需要關(guān)閉此選項(xiàng)。
-XX:CICompilerCount=threads設(shè)置編譯線程的個(gè)數(shù)。
-XX:CompileCommand=command,method[,option]自定義具體方法的編譯方式。
比如:
-XX:CompileCommand=exclude,java/lang/String.indexOf意思是把String的indexOf exclude from compiled。
這里的command有下面幾種:
- break - 為編譯設(shè)置斷點(diǎn)
- compileonly - exclude所有的方法,除了指定的方法
- dontinline - 指定的方法不inline
- exclude - 編譯的時(shí)候排除指定的方法
- inline - inline指定的方法
- log - exclude所有的方法日志,除了指定的方法
- option - 傳遞一個(gè)JIT編譯的參數(shù)
- print - 輸出生成的匯編代碼
- quiet - 不打印編譯命令
指定編譯某些命令。
-XX:CompileThreshold=invocations命令經(jīng)過多少次解釋執(zhí)行,才會(huì)被編譯。默認(rèn)情況下在-server模式,這個(gè)值是10,000, 在-client模式,這個(gè)值是1,500。
如果分層編譯開啟之后,這個(gè)值會(huì)被忽略。
-XX:+DoEscapeAnalysis開啟逃逸分析。
-XX:+Inline開啟inline特性。
-XX:+LogCompilation輸出編譯日志。
-XX:+PrintAssembly輸出匯編代碼。
-XX:-TieredCompilation取消分層編譯。
上圖:
總結(jié)
同樣的,為JDK10特意準(zhǔn)備了一個(gè)PDF,下載鏈接如下:
JDK10GC-cheatsheet.pdf
本文鏈接:http://www.flydean.com/jdk10-gc-cheatsheet/
最通俗的解讀,最深刻的干貨,最簡(jiǎn)潔的教程,眾多你不知道的小技巧等你來發(fā)現(xiàn)!
歡迎關(guān)注我的公眾號(hào):「程序那些事」,懂技術(shù),更懂你!
總結(jié)
以上是生活随笔為你收集整理的一张PDF了解JDK10 GC调优秘籍-附PDF下载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看动画学算法之:排序-插入排序
- 下一篇: JVM详解之:java class文件的