摘要:在jvm中有很多的參數可以進行設置,這樣可以讓jvm在各種環境中都能夠高效的運行。絕大部分的參數保持預設即可。 本文分享自華為雲社區《為什麼需要對jvm進行優化,jvm運行參數之標準參數》,作者:共飲一杯無。 我們為什麼要對jvm做優化? 在本地開發環境中我們很少會遇到需要對jvm進行優化的需 ...
摘要:在jvm中有很多的參數可以進行設置,這樣可以讓jvm在各種環境中都能夠高效的運行。絕大部分的參數保持預設即可。
本文分享自華為雲社區《為什麼需要對jvm進行優化,jvm運行參數之標準參數》,作者:共飲一杯無。
我們為什麼要對jvm做優化?
在本地開發環境中我們很少會遇到需要對jvm進行優化的需求,但是到了生產環境,我們可能將有下麵的需求:
運行的應用“卡住了”,日誌不輸出,程式沒有反應伺服器的CPU負載突然升高
在多線程應用下,如何分配線程的數量?
……
說明:使用的jdk版本為1.8。
jvm的運行參數
在jvm中有很多的參數可以進行設置,這樣可以讓jvm在各種環境中都能夠高效的運行。絕大部分的參數保持預設即可。
三種參數類型
jvm的參數類型分為三類,分別是:
- 標準參數
-help
-version
- -X參數(非標準參數,相對變化較少的)
-Xint
-Xcomp
- -XX參數(使用率較高,JVM調優的主要部分)
-XX:newSize
-XX:+UseSerialGC
標準參數
jvm的標準參數,一般都是很穩定的,在未來的JVM版本中不會改變,可以使用java -help
檢索出所有的標準參數。
C:\Users\zjq>java -help 用法: java [-options] class [args...] (執行類) 或 java [-options] -jar jarfile [args...] (執行 jar 文件) 其中選項包括: -d32 使用 32 位數據模型 (如果可用) -d64 使用 64 位數據模型 (如果可用) -server 選擇 "server" VM 預設 VM 是 server. -cp <目錄和 zip/jar 文件的類搜索路徑> -classpath <目錄和 zip/jar 文件的類搜索路徑> 用 ; 分隔的目錄, JAR 檔案 和 ZIP 檔案列表, 用於搜索類文件。 -D<名稱>=<值> 設置系統屬性 -verbose:[class|gc|jni] 啟用詳細輸出 -version 輸出產品版本並退出 -version:<值> 警告: 此功能已過時, 將在 未來發行版中刪除。 需要指定的版本才能運行 -showversion 輸出產品版本並繼續 -jre-restrict-search | -no-jre-restrict-search 警告: 此功能已過時, 將在 未來發行版中刪除。 在版本搜索中包括/排除用戶專用 JRE -? -help 輸出此幫助消息 -X 輸出非標準選項的幫助 -ea[:<packagename>...|:<classname>] -enableassertions[:<packagename>...|:<classname>] 按指定的粒度啟用斷言 -da[:<packagename>...|:<classname>] -disableassertions[:<packagename>...|:<classname>] 禁用具有指定粒度的斷言 -esa | -enablesystemassertions 啟用系統斷言 -dsa | -disablesystemassertions 禁用系統斷言 -agentlib:<libname>[=<選項>] 載入本機代理庫 <libname>, 例如 -agentlib:hprof 另請參閱 -agentlib:jdwp=help 和 -agentlib:hprof=help -agentpath:<pathname>[=<選項>] 按完整路徑名載入本機代理庫 -javaagent:<jarpath>[=<選項>] 載入 Java 編程語言代理, 請參閱 java.lang.instrument -splash:<imagepath> 使用指定的圖像顯示啟動屏幕 有關詳細信息, 請參閱 http://www.oracle.com/technetwork/java/javase/documentation/index.html。
實戰
實戰1:查看jvm版本
C:\Users\zjq>java -version java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
實戰2:通過**-D**設置系統屬性參數
public class TestJVM { public static void main(String[] args) { String str = System.getProperty("str"); if(str == null){ System.out.println("zjqzjq"); }else{ System.out.println(str); } System.gc(); } }
進行編譯、測試:
E:\jvm>javac TestJVM.java E:\jvm>java TestJVM zjqzjq E:\jvm>java -Dstr=hello-D TestJVM hello-D
-server與-client參數
可以通過-server或-client設置jvm的運行參數。
它們的區別是Server VM的初始堆空間會大一些,預設使用的是並行垃圾回收器,啟動慢運行快。
- Client VM相對來講會保守一些,初始堆空間會小一些,使用串列的垃圾回收器,它的目標是為了讓JVM的啟動速度更快,但運行速度會比Serverm模式慢些。
- JVM在啟動的時候會根據硬體和操作系統自動選擇使用Server還是Client類型的JVM。
- 32位操作系統
如果是Windows系統,不論硬體配置如何,都預設使用Client類型的JVM。
如果是其他操作系統上,機器配置有2GB以上的記憶體同時有2個以上CPU的話預設使用server模式,否則使用client模式。
- 64位操作系統
只有server類型,不支持client類型。
測試:
E:\jvm>java -client -showversion TestJVM java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode) zjqzjq E:\jvm>java -server -showversion TestJVM java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode) zjqzjq #由於機器是64位系統,所以不支持client模式