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