摘要:在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模式
點擊關注,第一時間了解華為云新鮮技術~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/542927.html
標籤:其他
上一篇:dapr本地托管的服務呼叫體驗與Java SDK的Spring Boot整合
下一篇:Java微服務隨機掉線排查思路
