JDK11相比JDK10,添加了一個新的Source-File Mode,能夠直接經過java來運行單個java源文件,而不須要進行編譯。同時還提供了新的HTTP API,支持響應性stream。java
固然上面的都不是重點,重點的是JDK11是一個LTS版本,是繼JDK8以後的又一個LTS版本,也多是你們往後使用的最多的一個版本。git
因此JDK11的JVM參數吸取了JDK9,JDK10的新特性和改動,並在他們的基礎上進行了微調。github
一樣在文章最後,我也將JDK11的GC調優祕籍作成了一張PDF,歡迎你們下載。優化
JDK11和JDK9,JDK10相比,廢棄的選項都差很少。這裏重點講下面幾個:spa
-XX:+AggressiveOpts
aggressive的中文意思是激進的,有進取心的意思。這個參數的意思是啓用激進的優化選項,默認狀況下是禁止的,而且是做爲一個體驗選項提供的。code
由於這個選項可能在後面的版本中做爲默認選項,因此在JDK11中是廢棄的。教程
-XX:+UseAppCDS
AppCDS是在JDK9 JPMS中引入的新特性,能夠提高java程序的啓動速度。內存
AppCDS默認狀況下是開啓的因此這裏也廢棄掉了。資源
注意,JVM中的參數若是是被廢棄掉了,並不必定說這個選項的特性JVM已經不支持了,也有多是JVM默認是開啓了這個選項。
什麼是Source-File Mode呢?get
Source-File Mode就是指能夠直接使用java命令來運行java源代碼,而不用使用javac進行編譯。
固然這個只對單文件的源代碼有效。
有兩種方式使用Source-File Mode,一種是源文件後面帶.java後綴,如:
java HelloWorld.java
一種是添加參數--source version選項:
java -source 11 HelloWorld
這裏的version指的是JDK版本號,能夠取值6,7,8,9,10,11。
若是沒有使用.java,則必須使用-source。
Source-File Mode的原理是將源代碼編譯到內存中,而後執行源代碼中的第一個class。
咱們知道JVM中的JIT編譯器會將一些熱點的java代碼編譯成機器碼,而這些機器碼會存儲在一個叫作code cache的地方。
CodeHeap就是用來生成和管理這些機器碼的類。每次存儲請求都會分配必定大小的空間,這個值是由CodeCacheSegmentSize來定義的。
固然,爲了提高效率,你能夠將CodeCacheSegmentSize的大小設置爲和cache line大小一致。不過這不是必須的。
Code Heap狀態分析就是分析code cache的狀態。
CodeHeap狀態分析分爲兩個部分。 第一部分檢查整個CodeHeap並彙總全部認爲有用/重要的信息。 第二部分能夠根據須要選的特定的命令來輸出本身須要的那部分。
咱們舉幾個例子:
實時分析:
jcmd <pid> Compiler.CodeHeap_Analytics [<function>] [<granularity>]
其中function能夠有下面的幾個選項:
granularity是和aggregate配合使用的,表明一個aggregate表明的存儲空間大小。
JDK11在AppCDS上面有所提高,能夠支持從module path導出 archiving classes:
$ java -Xshare:dump -XX:SharedClassListFile=class_list_file \ -XX:SharedArchiveFile=shared_archive_file \ --module-path=path_to_modular_jar -m module_name
使用:
$ java -XX:SharedArchiveFile=shared_archive_file \ --module-path=path_to_modular_jar -m module_name
一樣的,爲JDK11特地準備了一個PDF,下載連接以下:
本文連接: http://www.flydean.com/jdk11-gc-cheatsheet/最通俗的解讀,最深入的乾貨,最簡潔的教程,衆多你不知道的小技巧等你來發現!
歡迎關注個人公衆號:「程序那些事」,懂技術,更懂你!