【JVM调优】JVM的运行参数
在jvm中有很多的參數(shù)可以進(jìn)行設(shè)置,這樣可以讓jvm在各種環(huán)境中都能高效的運(yùn)行,絕大部分的參數(shù)保持默認(rèn)即可
三種參數(shù)類型
jvm的參數(shù)類型分為三類,分別是
* 標(biāo)準(zhǔn)參數(shù)* -help* -version* -server與-client * -X參數(shù) (非標(biāo)準(zhǔn)參數(shù)) * -Xint* -Xcomp * -XX參數(shù)(使用率較高)* -XX:newSize* -XX:+UseSerialGC標(biāo)準(zhǔn)參數(shù)
-help
jvm的標(biāo)準(zhǔn)參數(shù),一般都是很穩(wěn)定的,在未來(lái)的JVM版本中不會(huì)改變,可以使用java -help
檢索出所有的標(biāo)準(zhǔn)參數(shù)。
[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...](執(zhí)行類)或 java [options] -jar <jar 文件> [args...](執(zhí)行 jar 文件)或 java [options] -m <模塊>[/<主類>] [args...]java [options] --module <模塊>[/<主類>] [args...](執(zhí)行模塊中的主類)將主類, -jar <jar 文件>, -m 或 --module<模塊>/<主類> 后的參數(shù)作為參數(shù)傳遞到主類。其中, 選項(xiàng)包括:-d32 已過(guò)時(shí), 在以后的發(fā)行版中將被刪除-d64 已過(guò)時(shí), 在以后的發(fā)行版中將被刪除-cp <目錄和 zip/jar 文件的類搜索路徑>-classpath <目錄和 zip/jar 文件的類搜索路徑>--class-path <目錄和 zip/jar 文件的類搜索路徑>使用 : 分隔的, 用于搜索類文件的目錄, JAR 檔案和 ZIP 檔案列表。-p <模塊路徑>--module-path <模塊路徑>...用 : 分隔的目錄列表, 每個(gè)目錄都是一個(gè)包含模塊的目錄。--upgrade-module-path <模塊路徑>...用 : 分隔的目錄列表, 每個(gè)目錄都是一個(gè)包含模塊的目錄, 這些模塊用于替換運(yùn)行時(shí)映像中的可升級(jí)模塊--add-modules <模塊名稱>[,<模塊名稱>...]除了初始模塊之外要解析的根模塊。<模塊名稱> 還可以為 ALL-DEFAULT, ALL-SYSTEM,ALL-MODULE-PATH.--list-modules列出可觀察模塊并退出-d <module name>--describe-module <模塊名稱>描述模塊并退出--dry-run 創(chuàng)建 VM 并加載主類, 但不執(zhí)行 main 方法。此 --dry-run 選項(xiàng)對(duì)于驗(yàn)證諸如模塊系統(tǒng)配置這樣的命令行選項(xiàng)可能非常有用。--validate-modules驗(yàn)證所有模塊并退出--validate-modules 選項(xiàng)對(duì)于查找模塊路徑中模塊的沖突及其他錯(cuò)誤可能非常有用。-D<名稱>=<值>設(shè)置系統(tǒng)屬性-verbose:[class|module|gc|jni]啟用詳細(xì)輸出-version 將產(chǎn)品版本輸出到錯(cuò)誤流并退出--version 將產(chǎn)品版本輸出到輸出流并退出-showversion 將產(chǎn)品版本輸出到錯(cuò)誤流并繼續(xù)--show-version將產(chǎn)品版本輸出到輸出流并繼續(xù)--show-module-resolution在啟動(dòng)過(guò)程中顯示模塊解析輸出-? -h -help將此幫助消息輸出到錯(cuò)誤流--help 將此幫助消息輸出到輸出流-X 將額外選項(xiàng)的幫助輸出到錯(cuò)誤流--help-extra 將額外選項(xiàng)的幫助輸出到輸出流-ea[:<程序包名稱>...|:<類名>]-enableassertions[:<程序包名稱>...|:<類名>]按指定的粒度啟用斷言-da[:<程序包名稱>...|:<類名>]-disableassertions[:<程序包名稱>...|:<類名>]按指定的粒度禁用斷言-esa | -enablesystemassertions啟用系統(tǒng)斷言-dsa | -disablesystemassertions禁用系統(tǒng)斷言-agentlib:<庫(kù)名>[=<選項(xiàng)>]加載本機(jī)代理庫(kù) <庫(kù)名>, 例如 -agentlib:jdwp另請(qǐng)參閱 -agentlib:jdwp=help-agentpath:<路徑名>[=<選項(xiàng)>]按完整路徑名加載本機(jī)代理庫(kù)-javaagent:<jar 路徑>[=<選項(xiàng)>]加載 Java 編程語(yǔ)言代理, 請(qǐng)參閱 java.lang.instrument-splash:<圖像路徑>使用指定的圖像顯示啟動(dòng)屏幕自動(dòng)支持和使用 HiDPI 縮放圖像(如果可用)。應(yīng)始終將未縮放的圖像文件名 (例如, image.ext)作為參數(shù)傳遞給 -splash 選項(xiàng)。將自動(dòng)選取提供的最合適的縮放圖像。有關(guān)詳細(xì)信息, 請(qǐng)參閱 SplashScreen API 文檔@argument 文件一個(gè)或多個(gè)包含選項(xiàng)的參數(shù)文件-disable-@files阻止進(jìn)一步擴(kuò)展參數(shù)文件要為長(zhǎng)選項(xiàng)指定參數(shù), 可以使用 --<名稱>=<值> 或--<名稱> <值>。-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)通過(guò)-D設(shè)置系統(tǒng)屬性參數(shù)
package cs.lx.jvm;/*** @項(xiàng)目名稱 demo* @包名 cs.lx.jvm* @類名 TestJVM* @作者 lx* @時(shí)間 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編譯運(yùn)行,通過(guò)-D設(shè)置屬性參數(shù)
# 根目錄下創(chuàng)建test文件夾存放java文件[root@localhost ~]# mkdir test# 查看目錄內(nèi)容[root@localhost ~]# ll總用量 2drwxr-xr-x. 2 root root 6 10月 8 23:57 test# 進(jìn)入test目錄[root@localhost ~]# cd test# vim命令創(chuàng)建TestJVM.java文件,復(fù)制剛剛寫的代碼,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# 運(yùn)行[root@localhost test]# java TestJVMmobaijun# 通過(guò)-D設(shè)置屬性參數(shù)[root@localhost test]# java -Dstr=nihaojvm TestJVM# 運(yùn)行結(jié)果nihaojvm-server與-client參數(shù)
可以通過(guò)-server或-client設(shè)置jvm的運(yùn)行參數(shù)。
* 它們的區(qū)別是Server VM的初始堆空間會(huì)大一些,默認(rèn)使用的是并行垃圾回收器,啟動(dòng)慢運(yùn)行快。 * Client VM相對(duì)來(lái)講會(huì)保守一些,初始堆空間會(huì)小一些,使用串行的垃圾回收器,它的目標(biāo)是為了讓JVM的啟動(dòng)速度更快,但運(yùn)行速度會(huì)比Serverm模式慢些。 * JVM在啟動(dòng)的時(shí)候會(huì)根據(jù)硬件和操作系統(tǒng)自動(dòng)選擇使用Server還是Client類型的JVM。 * 32位操作系統(tǒng)* 如果是Windows系統(tǒng),不論硬件配置如何,都默認(rèn)使用Client類型的JVM。* 如果是其他操作系統(tǒng)上,機(jī)器配置有2GB以上的內(nèi)存同時(shí)有2個(gè)以上CPU的話默認(rèn)使用server模式,否則使用client模式。 * 64位操作系統(tǒng)* 只有server類型,不支持client類型。測(cè)試:
[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# 由于機(jī)器是64位系統(tǒng),所以不支持client模式-X參數(shù)
jvm的-X參數(shù)是非標(biāo)準(zhǔn)參數(shù),在不同版本的jvm中,參數(shù)可能會(huì)有所不同,可以通過(guò)java -X查看非標(biāo)準(zhǔn)參數(shù)。
英語(yǔ)特別牛的,請(qǐng)繞道
[root@localhost ~]# java -X-Xmixed mixed mode execution (default) # 混合模式執(zhí)行-Xint interpreted mode execution only # 僅解釋模式執(zhí)行# 用:分隔的目錄和zip/jar文件-Xbootclasspath:<directories and zip/jar files separated by :> # 設(shè)置搜索路徑引導(dǎo)類和資源set search path for bootstrap classes and resources# 用:分隔的目錄和zip/jar文件-Xbootclasspath/a:<directories and zip/jar files separated by :># 附加在引導(dǎo)類路徑末尾append to end of bootstrap class path# 用:分隔的目錄和zip/jar文件-Xbootclasspath/p:<directories and zip/jar files separated by :># 置于引導(dǎo)類路徑之前prepend in front of bootstrap class path# 顯示附加診斷消息-Xdiag show additional diagnostic messages# 禁用類垃圾收集-Xnoclassgc disable class garbage collection# 啟用增量垃圾收集-Xincgc enable incremental garbage collection# 將GC狀態(tài)記錄在文件中,帶時(shí)間戳-Xloggc:<file> log GC status to a file with time stamps# 禁用后臺(tái)編譯-Xbatch disable background compilation# 設(shè)置初始java堆大小-Xms<size> set initial Java heap size# 設(shè)置最大java堆大小-Xmx<size> set maximum Java heap size# 設(shè)置java線程堆棧大小-Xss<size> set java thread stack size# 輸出cpu配置文件數(shù)據(jù)-Xprof output cpu profiling data# 啟用最嚴(yán)格的檢查,預(yù)期將來(lái)的默認(rèn)值-Xfuture enable strictest checks, anticipating future default# 減少java/VM對(duì)操作系統(tǒng)信號(hào)的使用(請(qǐng)參閱文檔)-Xrs reduce use of OS signals by Java/VM (see documentation)# 對(duì)jni函數(shù)執(zhí)行其他檢查-Xcheck:jni perform additional checks for JNI functions# 不嘗試使用共享類數(shù)據(jù)-Xshare:off do not attempt to use shared class data# 在可能的情況下使用共享類數(shù)據(jù)(默認(rèn))-Xshare:auto use shared class data if possible (default)# 要求使用共享類數(shù)據(jù),否則將失效-Xshare:on require using shared class data, otherwise fail.# 顯示所有設(shè)置并繼續(xù)-XshowSettings show all settings and continue-XshowSettings:all# 顯示所有設(shè)置并繼續(xù)show all settings and continue# 顯示所有與vm相關(guān)的設(shè)置并繼續(xù)-XshowSettings:vm show all vm related settings and continue-XshowSettings:properties# 顯示所有屬性設(shè)置并繼續(xù)show all property settings and continue-XshowSettings:locale# 顯示所有與區(qū)域設(shè)置相關(guān)的設(shè)置并繼續(xù)show all locale related settings and continue# -X 選項(xiàng)是非標(biāo)準(zhǔn)的選項(xiàng),如有更改,恕不另行通知The -X options are non-standard and subject to change without notice.-Xint、-Xcomp、-Xmixed參數(shù)
* -Xint:在解釋模式(interpreted mode)下,-Xint標(biāo)記會(huì)強(qiáng)制JVM執(zhí)行所有的字節(jié)碼,當(dāng)然這會(huì)降低運(yùn)行速度,通常低10倍或更多。* -Xcomp編譯模式:-Xcomp參數(shù)與它(-Xint)正好相反,JVM在第一次使用時(shí)會(huì)把所有的字節(jié)碼編譯成本地代碼,從而帶來(lái)最大程度的優(yōu)化。* 然而,很多應(yīng)用在使用-Xcomp也會(huì)有一些性能損失,當(dāng)然這比使用-Xint損失的少,原因是-xcomp沒有讓JVM啟用JIT編譯器的全部功能。JIT編譯器可以對(duì)是否需要編譯做判斷,如果所有代碼都進(jìn)行編譯的話,對(duì)于一些只執(zhí)行一次的代碼就沒有意義了。* -Xmixed是混合模式,將解釋模式與編譯模式進(jìn)行混合使用,由jvm自己決定,這是jvm默認(rèn)的模式,也是推薦使用的模式。示例:強(qiáng)制設(shè)置運(yùn)行模式
# 強(qiáng)制設(shè)置為解釋模式 編譯快,運(yùn)行慢[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# 強(qiáng)制設(shè)置為編譯模式 [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# 注意:編譯模式下,第一次執(zhí)行速度會(huì)比解釋模式下執(zhí)行速度慢一些,需要注意觀察。# 默認(rèn)的混合模式[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參數(shù)
-XX參數(shù)也是非標(biāo)準(zhǔn)參數(shù),主要用于jvm的調(diào)優(yōu)和debug操作。
-XX參數(shù)的使用有2種方式,一種是boolean類型,一種是非boolean類型:* boolean類型* 格式:-XX:[+-]<name>表示啟用或者禁用<name>屬性* 如:-XX:+DisableExplicitGC 表示禁用手動(dòng)調(diào)用gc操作,也就是說(shuō)調(diào)用System.gc()無(wú)效* 非boolean類型* 格式:-XX:<name>=<value>表示<name>屬性的值為<value>* 如:-XX:NewRatio=1 表示新生代和老年代的比值測(cè)試:
[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參數(shù)
- -Xms與-Xmx分別是設(shè)置jvm的堆內(nèi)存的初始大小和最大大小。
- -Xmx2048m:等價(jià)于-XX:MaxHeapSize,設(shè)置JVM最大堆內(nèi)存為2048M。
- -Xms512m:等價(jià)于-XX:InitialHeapSize,設(shè)置JVM初始堆內(nèi)存為512M。
- 適當(dāng)?shù)恼{(diào)整jvm的內(nèi)存大小,可以充分利用服務(wù)器資源,讓程序跑的更快。
查看jvm的運(yùn)行參數(shù)
有些時(shí)候需要查看jvm的運(yùn)行參數(shù),這個(gè)需求可能存在兩種情況
- 運(yùn)行java命令時(shí)打印出運(yùn)行參數(shù)
- 查看正在運(yùn)行的java進(jìn)程的參數(shù)
運(yùn)行java命令時(shí)打印出運(yùn)行參數(shù)
java -XX:+PrintFlagsInitial -version這個(gè)命令的值很多,保存到文件中-XX:+PrintFlagsInitial -version > flag.txt
如:
[root@localhost test]# java -XX:+PrintFlagsInitial -version #把他輸出到一個(gè)文件 [root@localhost test]# java -XX:+PrintFlagsInitial -version > flags.txt參數(shù)太多了,通過(guò)查看可以看出,參數(shù)有boolean類型和數(shù)字類型,值的操作是(= 默認(rèn)值)或者(:= 被修改的值)
查看正在運(yùn)行的java進(jìn)程的參數(shù)
想要查看正在運(yùn)行的jvm就需要借助jinfo命令查看
首先啟動(dòng)tomcat用于測(cè)試,觀察下運(yùn)行的jvm參數(shù)
rz # 上傳 tar -xvf apache-tomcat-7.0.57.tar.gz # 解壓 cd apache-tomcat-7.0.57 cd bin/ ./startup.sh # 啟動(dòng)tomcatjinfo命令
# 查看所有的參數(shù),用法:jinfo -flags <進(jìn)程id># 通過(guò)jps 或者jps -l 查看java進(jìn)程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 # 查看某一個(gè)參數(shù)的值,用法:jinfo -flag <參數(shù)名> <進(jìn)程id> [root@localhost bin]# jinfo -flag MaxHeapSize 6219 -XX:MaxHeapSize=488636416總結(jié)
以上是生活随笔為你收集整理的【JVM调优】JVM的运行参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【JVM调优】JVM指令集大全
- 下一篇: 【工具类】时间相关的方法