不出意外這既是6月的第一份文章也是最後一份文章,由於到期末要考試了html
目前本機使用JDK11和1.8,默認是1.8,所以輸入java -version
會是這樣java
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)服務器
我的對Server VM
和mixed mode
字眼表示不太理解,所以找了一下相關的JVM資料oracle
1.關於Server和Clientide
二者有不一樣的JIT編譯器應用於相同的運行時環境性能
Client VM是專門爲快速啓動和小內存(small footprints)而優化的,像GUI就很適合測試
而Server VM是專門爲高性能應用而優化的,如服務器應用優化
其餘的話有編譯的方法(compile policy),堆的默認值(heap defaults),內聯方法(inline policy)ui
比方說,Client VM的編譯器沒有采用複雜的優化技術,所以才能快速啓動,反之,Server VM採用大量複雜的優化,致使開始時響應很慢,但性能牛逼code
同時Server JVM的默認堆和最大堆都比Client的大
命令以下java -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version'
一些可能有用的信息↓
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/server-class.html
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#sthref30
怎麼切換默認的VM?不知道hhh
查了一下能夠經過java -client -version來切換,但實機測試過並沒有效果。。。
2.關於各類mode
JVM能夠用-Xint -Xcomp -Xmixed指定相應的模式(解釋interpreted、編譯compiled、混合)
簡單的總結是
解釋器模式就是執行字節碼
編譯器模式是所有轉換本地代碼
混合模式是在熱點方法使用本地代碼,而不常使用的就僅執行解釋(HotSpot由來)
前二者顯然是編譯期就能完成的事情(javac),然後者是運行期的事情就歸JIT來管了,這部分比較硬核有待惡補