【JVM调优】JVM的运行参数
生活随笔
收集整理的這篇文章主要介紹了
【JVM调优】JVM的运行参数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在jvm中有很多的參數可以進行設置,這樣可以讓jvm在各種環境中都能高效的運行,絕大部分的參數保持默認即可
三種參數類型
jvm的參數類型分為三類,分別是
* 標準參數* -help* -version* -server與-client * -X參數 (非標準參數) * -Xint* -Xcomp * -XX參數(使用率較高)* -XX:newSize* -XX:+UseSerialGC標準參數
-help
jvm的標準參數,一般都是很穩定的,在未來的JVM版本中不會改變,可以使用java -help
檢索出所有的標準參數。
[root@localhost ~]# java -help用法: java [options] <主類> [args...]Usage: java [-options] class [args...](to execute a class)or java [-options] -jar jarfile [args...](to execute a jar file)where options include:-d32 use a 32-bit data model if available-d64 use a 64-bit data model if available-server to select the "server" VMThe default VM is server.-cp <class search path of directories and zip/jar files>-classpath <class search path of directories and zip/jar files>A : separated list of directories, JAR archives,and ZIP archives to search for class files.-D<name>=<value>set a system property-verbose:[class|gc|jni]enable verbose output-version print product version and exit-version:<value>Warning: this feature is deprecated and will be removedin a future release.require the specified version to run-showversion print product version and continue-jre-restrict-search | -no-jre-restrict-searchWarning: this feature is deprecated and will be removedin a future release.include/exclude user private JREs in the version search-? -help print this help message-X print help on non-standard options-ea[:<packagename>...|:<classname>]-enableassertions[:<packagename>...|:<classname>]enable assertions with specified granularity-da[:<packagename>...|:<classname>]-disableassertions[:<packagename>...|:<classname>]disable assertions with specified granularity-esa | -enablesystemassertionsenable system assertions-dsa | -disablesystemassertionsdisable system assertions-agentlib:<libname>[=<options>]load native agent library <libname>, e.g. -agentlib:hprofsee also, -agentlib:jdwp=help and -agentlib:hprof=help-agentpath:<pathname>[=<options>]load native agent library by full pathname-javaagent:<jarpath>[=<options>]load Java programming language agent, see java.lang.instrument-splash:<imagepath>show splash screen with specified imageSee http://www.oracle.com/technetwork/java/javase/documentation/index.html for more details. [root@localhost ~]# java -help用法: java [options] <主類> [args...](執行類)或 java [options] -jar <jar 文件> [args...](執行 jar 文件)或 java [options] -m <模塊>[/<主類>] [args...]java [options] --module <模塊>[/<主類>] [args...](執行模塊中的主類)將主類, -jar <jar 文件>, -m 或 --module<模塊>/<主類> 后的參數作為參數傳遞到主類。其中, 選項包括:-d32 已過時, 在以后的發行版中將被刪除-d64 已過時, 在以后的發行版中將被刪除-cp <目錄和 zip/jar 文件的類搜索路徑>-classpath <目錄和 zip/jar 文件的類搜索路徑>--class-path <目錄和 zip/jar 文件的類搜索路徑>使用 : 分隔的, 用于搜索類文件的目錄, JAR 檔案和 ZIP 檔案列表。-p <模塊路徑>--module-path <模塊路徑>...用 : 分隔的目錄列表, 每個目錄都是一個包含模塊的目錄。--upgrade-module-path <模塊路徑>...用 : 分隔的目錄列表, 每個目錄都是一個包含模塊的目錄, 這些模塊用于替換運行時映像中的可升級模塊--add-modules <模塊名稱>[,<模塊名稱>...]除了初始模塊之外要解析的根模塊。<模塊名稱> 還可以為 ALL-DEFAULT, ALL-SYSTEM,ALL-MODULE-PATH.--list-modules列出可觀察模塊并退出-d <module name>--describe-module <模塊名稱>描述模塊并退出--dry-run 創建 VM 并加載主類, 但不執行 main 方法。此 --dry-run 選項對于驗證諸如模塊系統配置這樣的命令行選項可能非常有用。--validate-modules驗證所有模塊并退出--validate-modules 選項對于查找模塊路徑中模塊的沖突及其他錯誤可能非常有用。-D<名稱>=<值>設置系統屬性-verbose:[class|module|gc|jni]啟用詳細輸出-version 將產品版本輸出到錯誤流并退出--version 將產品版本輸出到輸出流并退出-showversion 將產品版本輸出到錯誤流并繼續--show-version將產品版本輸出到輸出流并繼續--show-module-resolution在啟動過程中顯示模塊解析輸出-? -h -help將此幫助消息輸出到錯誤流--help 將此幫助消息輸出到輸出流-X 將額外選項的幫助輸出到錯誤流--help-extra 將額外選項的幫助輸出到輸出流-ea[:<程序包名稱>...|:<類名>]-enableassertions[:<程序包名稱>...|:<類名>]按指定的粒度啟用斷言-da[:<程序包名稱>...|:<類名>]-disableassertions[:<程序包名稱>...|:<類名>]按指定的粒度禁用斷言-esa | -enablesystemassertions啟用系統斷言-dsa | -disablesystemassertions禁用系統斷言-agentlib:<庫名>[=<選項>]加載本機代理庫 <庫名>, 例如 -agentlib:jdwp另請參閱 -agentlib:jdwp=help-agentpath:<路徑名>[=<選項>]按完整路徑名加載本機代理庫-javaagent:<jar 路徑>[=<選項>]加載 Java 編程語言代理, 請參閱 java.lang.instrument-splash:<圖像路徑>使用指定的圖像顯示啟動屏幕自動支持和使用 HiDPI 縮放圖像(如果可用)。應始終將未縮放的圖像文件名 (例如, image.ext)作為參數傳遞給 -splash 選項。將自動選取提供的最合適的縮放圖像。有關詳細信息, 請參閱 SplashScreen API 文檔@argument 文件一個或多個包含選項的參數文件-disable-@files阻止進一步擴展參數文件要為長選項指定參數, 可以使用 --<名稱>=<值> 或--<名稱> <值>。-version
查看jvm的版本
[root@localhost ~]# java -versionjava version "1.8.0_211"Java(TM) SE Runtime Environment (build 1.8.0_211-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)通過-D設置系統屬性參數
package cs.lx.jvm;/*** @項目名稱 demo* @包名 cs.lx.jvm* @類名 TestJVM* @作者 lx* @時間 2020/4/19 15:28* @描述*/public class TestJVM {public static void main(String[] args) {String str = System.getProperty("str");if (str == null){System.out.println("你好!!趙麗穎!!!");}else {System.out.println(str);}}}用Linux編譯運行,通過-D設置屬性參數
# 根目錄下創建test文件夾存放java文件[root@localhost ~]# mkdir test# 查看目錄內容[root@localhost ~]# ll總用量 2drwxr-xr-x. 2 root root 6 10月 8 23:57 test# 進入test目錄[root@localhost ~]# cd test# vim命令創建TestJVM.java文件,復制剛剛寫的代碼,esc返回,shift+:,輸入wq保存[root@localhost test]# vim TestJVM.java# 編譯class文件[root@localhost test]# javac TestJVM.java [root@localhost test]# ll總用量 8-rw-r--r--. 1 root root 575 10月 8 23:58 TestJVM.class-rw-r--r--. 1 root root 225 10月 8 23:58 TestJVM.java# 運行[root@localhost test]# java TestJVMmobaijun# 通過-D設置屬性參數[root@localhost test]# java -Dstr=nihaojvm TestJVM# 運行結果nihaojvm-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類型。測試:
[root@localhost test]# java -client -showversion TestJVMjava version "1.8.0_211"Java(TM) SE Runtime Environment (build 1.8.0_211-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)wanyuan[root@localhost test]# java -server -showversion TestJVMjava version "1.8.0_211"Java(TM) SE Runtime Environment (build 1.8.0_211-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)wanyuan# 由于機器是64位系統,所以不支持client模式-X參數
jvm的-X參數是非標準參數,在不同版本的jvm中,參數可能會有所不同,可以通過java -X查看非標準參數。
英語特別牛的,請繞道
[root@localhost ~]# java -X-Xmixed mixed mode execution (default) # 混合模式執行-Xint interpreted mode execution only # 僅解釋模式執行# 用:分隔的目錄和zip/jar文件-Xbootclasspath:<directories and zip/jar files separated by :> # 設置搜索路徑引導類和資源set search path for bootstrap classes and resources# 用:分隔的目錄和zip/jar文件-Xbootclasspath/a:<directories and zip/jar files separated by :># 附加在引導類路徑末尾append to end of bootstrap class path# 用:分隔的目錄和zip/jar文件-Xbootclasspath/p:<directories and zip/jar files separated by :># 置于引導類路徑之前prepend in front of bootstrap class path# 顯示附加診斷消息-Xdiag show additional diagnostic messages# 禁用類垃圾收集-Xnoclassgc disable class garbage collection# 啟用增量垃圾收集-Xincgc enable incremental garbage collection# 將GC狀態記錄在文件中,帶時間戳-Xloggc:<file> log GC status to a file with time stamps# 禁用后臺編譯-Xbatch disable background compilation# 設置初始java堆大小-Xms<size> set initial Java heap size# 設置最大java堆大小-Xmx<size> set maximum Java heap size# 設置java線程堆棧大小-Xss<size> set java thread stack size# 輸出cpu配置文件數據-Xprof output cpu profiling data# 啟用最嚴格的檢查,預期將來的默認值-Xfuture enable strictest checks, anticipating future default# 減少java/VM對操作系統信號的使用(請參閱文檔)-Xrs reduce use of OS signals by Java/VM (see documentation)# 對jni函數執行其他檢查-Xcheck:jni perform additional checks for JNI functions# 不嘗試使用共享類數據-Xshare:off do not attempt to use shared class data# 在可能的情況下使用共享類數據(默認)-Xshare:auto use shared class data if possible (default)# 要求使用共享類數據,否則將失效-Xshare:on require using shared class data, otherwise fail.# 顯示所有設置并繼續-XshowSettings show all settings and continue-XshowSettings:all# 顯示所有設置并繼續show all settings and continue# 顯示所有與vm相關的設置并繼續-XshowSettings:vm show all vm related settings and continue-XshowSettings:properties# 顯示所有屬性設置并繼續show all property settings and continue-XshowSettings:locale# 顯示所有與區域設置相關的設置并繼續show all locale related settings and continue# -X 選項是非標準的選項,如有更改,恕不另行通知The -X options are non-standard and subject to change without notice.-Xint、-Xcomp、-Xmixed參數
* -Xint:在解釋模式(interpreted mode)下,-Xint標記會強制JVM執行所有的字節碼,當然這會降低運行速度,通常低10倍或更多。* -Xcomp編譯模式:-Xcomp參數與它(-Xint)正好相反,JVM在第一次使用時會把所有的字節碼編譯成本地代碼,從而帶來最大程度的優化。* 然而,很多應用在使用-Xcomp也會有一些性能損失,當然這比使用-Xint損失的少,原因是-xcomp沒有讓JVM啟用JIT編譯器的全部功能。JIT編譯器可以對是否需要編譯做判斷,如果所有代碼都進行編譯的話,對于一些只執行一次的代碼就沒有意義了。* -Xmixed是混合模式,將解釋模式與編譯模式進行混合使用,由jvm自己決定,這是jvm默認的模式,也是推薦使用的模式。示例:強制設置運行模式
# 強制設置為解釋模式 編譯快,運行慢[root@localhost test]# java -showversion -Xint TestJVMjava version "1.8.0_211"Java(TM) SE Runtime Environment (build 1.8.0_211-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, interpreted mode)wanyuan# 強制設置為編譯模式 [root@localhost test]# java -showversion -Xcomp TestJVMjava version "1.8.0_211"Java(TM) SE Runtime Environment (build 1.8.0_211-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, compiled mode)wanyuan# 注意:編譯模式下,第一次執行速度會比解釋模式下執行速度慢一些,需要注意觀察。# 默認的混合模式[root@localhost test]# java -showversion TestJVMjava version "1.8.0_211"Java(TM) SE Runtime Environment (build 1.8.0_211-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)wanyuan-XX參數
-XX參數也是非標準參數,主要用于jvm的調優和debug操作。
-XX參數的使用有2種方式,一種是boolean類型,一種是非boolean類型:* boolean類型* 格式:-XX:[+-]<name>表示啟用或者禁用<name>屬性* 如:-XX:+DisableExplicitGC 表示禁用手動調用gc操作,也就是說調用System.gc()無效* 非boolean類型* 格式:-XX:<name>=<value>表示<name>屬性的值為<value>* 如:-XX:NewRatio=1 表示新生代和老年代的比值測試:
[root@localhost test]# java -showversion -XX:+DisableExplicitGC TestJVM java version "1.8.0_211" Java(TM) SE Runtime Environment (build 1.8.0_211-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)wanyuan-Xms與-Xmx參數
- -Xms與-Xmx分別是設置jvm的堆內存的初始大小和最大大小。
- -Xmx2048m:等價于-XX:MaxHeapSize,設置JVM最大堆內存為2048M。
- -Xms512m:等價于-XX:InitialHeapSize,設置JVM初始堆內存為512M。
- 適當的調整jvm的內存大小,可以充分利用服務器資源,讓程序跑的更快。
查看jvm的運行參數
有些時候需要查看jvm的運行參數,這個需求可能存在兩種情況
- 運行java命令時打印出運行參數
- 查看正在運行的java進程的參數
運行java命令時打印出運行參數
java -XX:+PrintFlagsInitial -version這個命令的值很多,保存到文件中-XX:+PrintFlagsInitial -version > flag.txt
如:
[root@localhost test]# java -XX:+PrintFlagsInitial -version #把他輸出到一個文件 [root@localhost test]# java -XX:+PrintFlagsInitial -version > flags.txt參數太多了,通過查看可以看出,參數有boolean類型和數字類型,值的操作是(= 默認值)或者(:= 被修改的值)
查看正在運行的java進程的參數
想要查看正在運行的jvm就需要借助jinfo命令查看
首先啟動tomcat用于測試,觀察下運行的jvm參數
rz # 上傳 tar -xvf apache-tomcat-7.0.57.tar.gz # 解壓 cd apache-tomcat-7.0.57 cd bin/ ./startup.sh # 啟動tomcatjinfo命令
# 查看所有的參數,用法:jinfo -flags <進程id># 通過jps 或者jps -l 查看java進程id [root@localhost bin]# jps 6346 Jps 6219 Bootstrap [root@localhost bin]# jps -l 6346 sun.tools.jps.Jps 6219 org.apache.catalina.startup.Bootstrap[root@localhost bin]# jinfo -flags 6219 Attaching to process ID 6219, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.211-b12 Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=31457280 -XX:MaxHeapSize=488636416 -XX:MaxNewSize=162529280 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=1572864 -XX:OldSize=29884416 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC # 查看某一個參數的值,用法:jinfo -flag <參數名> <進程id> [root@localhost bin]# jinfo -flag MaxHeapSize 6219 -XX:MaxHeapSize=488636416總結
以上是生活随笔為你收集整理的【JVM调优】JVM的运行参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【JVM调优】JVM指令集大全
- 下一篇: 【工具类】时间相关的方法