您好,登錄后才能下訂單哦!
java命令的秘密是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
一句話概括:簡單的java啟動命令,原來藏著這么多秘密,本文為你揭曉。
剛開始學java的同學,一定都不會忘記安裝完jdk后,都會使用java -version
命令來檢測一下是否安裝成功,那還有沒有其它參數可以使用呢?平時開發和運行java應用時,經常看到一些-D
的參數(如使用maven時,package
時會使用-Dmaven.test.skip
),這些參數是用來做什么的?還有經常說到調優,都會涉及到-Xms
和-Xmx
的設置,它是什么意思呢?這些,基本都是在使用java
命令啟動應用時所使用的參數,它的參數有很多,特別涉及到應用調優和問題診斷時會經常使用,學習java的同學都應該了解一下。本文將對java命令的啟動參數進行詳細描述,著重講解常用的設置及用于調試監測的設置。
啟動java應用使用的是java
(class文件)或java -jar
(jar或war包)命令,java命令其實就是生成一個JVM的實例,java應用則運行于此JVM實例中,JVM負責類加載,運行時區域堆棧分配等工作,當應用退出,JVM實例也會關閉。啟動多個java應用,也會啟動多個JVM實例,它們不會相互影響(但它們都共享同一系統的資源),這也是為什么使用一個JDK,可以跑多個java應用的背后邏輯。使用java命令啟動應用所使用的參數,基本是用于JVM的,JVM實例通過調用某個初始類的main()方法來運行一個Java程序,此方法將作為該程序初始線程的起點,任何其他的線程都是由這個初始線程啟動的。在JVM內部有兩種線程:守護線程(如垃圾回收線程)和非守護線程(main
方法線程及用戶使用Thread
創建的線程),當該程序中所有的非守護線程都終止時,JVM實例將自動退出。
java命令究竟有哪些參數可以用,這些參數分別有什么作用,簡單的不帶參數使用java
或java -help
或java -?
,即可看到此命令的使用方法及參數描述,如下所示:
java
執行類文件,java -jar
執行jar
或war
文件。上面只是把參數簡要的列了出來,更詳細的參數說明,可參考官網的java
命令說明(https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
)。使用java命令啟動應用所使用的參數,基本是用于JVM的,某種程度上也叫做JVM參數。總的來說,java啟動參數共分為三大類,分別是:
標準參數(-):相對穩定的參數,每個版本的JVM都可用。
非標準X參數(-X):默認jvm實現這些參數的功能,但是并不保證所有jvm實現都滿足,且不保證向后兼容。
XX參數(-XX):此類參數各個jvm實現會有所不同,將來可能會隨時取消。
下面將會對這些參數進行說明。
從前面使用java -?
可以看到,以-
開頭的參數,都屬于標準參數,我們常用的-help
,-version
,-classpath
,-Dproperty=value
等均屬于標準參數。參數詳細說明如下:
-d32及-d64 分別表示應用運行在32位或64位的環境中,使用Java HotSpot Server VM的默認使用的是server模式,而server模式默認使用的是-d64,因此在沒有使用此參數時,默認就是-d64。 -server 選擇 "server" VM,默認 VM 是 server,表示是在服務器類計算機上運行。 -cp或-classpath <目錄和 zip/jar 文件的類搜索路徑>linux用":",windows用";"來分隔目錄, JAR 檔案和 ZIP 檔案列表, 用于搜索類文件。 使用-classpath后jvm將不再使用CLASSPATH中的類搜索路徑,如果-classpath和CLASSPATH都沒有設置,則jvm使用當前路徑(.)作為類搜索路徑。 -D<名稱>=<值> 設置系統屬性,運行在此jvm之上的應用程序可用System.getProperty(“property”)得到value的值。 如果value中有空格,則需要用雙引號將該值括起來,如-Dfoo=”foo bar”。該參數通常用于設置系統級全局變量值,如配置文件路徑,以便該屬性在程序中任何地方都可訪問。 -verbose:[class|gc|jni] 啟用詳細輸出,一般在調試和診斷時,都會把gc的詳細信息輸出 -version 輸出產品版本并退出 -version:<值> 需要指定的版本才能運行 -showversion 輸出產品版本并繼續,即輸出版本后,繼續按java執行,這是跟-version的區別 -jre-restrict-search | -no-jre-restrict-search 在版本搜索中包括/排除用戶專用 JRE -? -help 輸出此幫助消息 -X 輸出非標準選項的幫助 -ea或-enableassertions [:<packagename>...|:<classname>] 按指定的粒度啟用斷言,默認jvm關閉斷言機制 -da或-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> 使用指定的圖像顯示啟動屏幕,一般用于圖形編程。
由上面描述可,可知道我們常用的-version
,-classpath
,-Dproperty=value
是用于做什么的了。特別提一下-classpath
(以前遇到由于這個導致運行問題),jvm在加載類時,搜索的路徑就是此路徑,而它在linux及windows使用的分隔符是不一樣的,linux用:
,windows用;
來分隔。
使用命令java -X
,即可把非標準參數輸出,平時使用中,我們用得較多的就是-Xloggc
,-Xms<size>
,-Xmx<size>
,-Xss<size>
,-Xmn<size>
了,詳細說明如下所示:
-Xmixed 默認是mixed,使用它們來設置JVM的本地代碼編譯模式 -Xint 表示解釋執行,所有的字節碼將被直接執行,而不會編譯成本地碼 -Xcomp 表示第一次使用就編譯成本地代碼。 -Xbatch 禁止后臺代碼編譯,強制在前臺編譯,編譯完成之后才能進行代碼執行,默認情況下,jvm在后臺進行編譯,若沒有編譯完成,則前臺運行代碼時以解釋模式運行 -Xbootclasspath: 設置搜索路徑以引導類和資源,讓jvm從指定路徑(可以是分號分隔的目錄、jar、或者zip)中加載bootclass,用來替換jdk的rt.jar -Xbootclasspath/a: 附加在引導類路徑末尾 -Xbootclasspath/p: 置于引導類路徑之前,讓jvm優先于bootstrap默認路徑加載指定路徑的所有文件 -Xcheck:jni 對JNI函數進行附加check;此時jvm將校驗傳遞給JNI函數參數的合法性,在本地代碼中遇到非法數據時,jmv將報一個致命錯誤而終止;使用該參數后將造成性能下降,請慎用。 -Xfuture 讓jvm對類文件執行嚴格的格式檢查(默認jvm不進行嚴格格式檢查),以符合類文件格式規范,推薦開發人員使用該參數 -Xincgc 開啟增量gc(默認為關閉);這有助于減少長時間GC時應用程序出現的停頓;但由于可能和應用程序并發執行,所以會降低CPU對應用的處理能力 -Xloggc:file 與-verbose:gc功能類似,只是將每次GC事件的相關情況記錄到一個文件中,文件的位置最好在本地,以避免網絡的潛在問題。若與verbose命令同時出現在命令行中,則以-Xloggc為準。 -Xms 指定jvm堆的初始大小,默認為物理內存的1/64,最小為1M;可以指定單位,比如k、m,若不指定,則默認為字節。 -Xmx 指定jvm堆的最大值,默認為物理內存的1/4或者1G,最小為2M;單位與-Xms一致。 -Xss 設置單個線程棧的大小,一般默認為512k。 -Xmn 設置堆(heap)的年輕代的初始值及最大值,單位與-Xms一致,年輕代是存儲新對象的地址,也是GC發生得最頻繁的地方,若設置過小,則會容易觸發年輕代垃圾回收(minor gc),若設置過大,只觸發full gc,則占用時間會很長,oracle建議是把年輕代設置在堆大小的四份之一到一半的。這命令同時設置了初始值和最大值,可以使用-XX:NewSize和-XX:MaxNewSiz來分別設置。 -XshowSettings 顯示所有設置并繼續
上述參數中,-Xms<size>
,-Xmx<size>
,-Xss<size>
,-Xmn<size>
都是我們性能優化中很重要的參數,-Xloggc
是在沒有專業跟蹤工具情況下排錯的好手。
此類參數非常豐富,包括高級運行時參數,高級JIT編譯參數,高級維護參數和高級GC參數,在官網可以看到它全部的參數(https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
),各個版本jvm實現有可能會有所不同。其中按設置格式,主要分為兩類,一種是boolean
類型,主要用于功能開關,一種是key-value
類型,主要性能、調試參數等設置,下面列舉一些主要使用的參數。
此類參數,格式:-XX:[+-]<name>
,作為功能開關,表示啟用或者禁用屬性。以下列舉一些:
-XX:+PrintFlagsFinal 輸出參數的最終值 -XX:+PrintFlagsInitial 輸出參數的默認值 -XX:-DisableExplicitGC 禁止調用System.gc();但jvm的gc仍然有效 -XX:+MaxFDLimit 最大化文件描述符的數量限制 -XX:+ScavengeBeforeFullGC 新生代GC優先于Full GC執行 -XX:+UseGCOverheadLimit 在拋出OOM之前限制jvm耗費在GC上的時間比例 -XX:-UseConcMarkSweepGC 對老生代采用并發標記交換算法進行GC -XX:-UseParallelGC 啟用并行GC -XX:-UseParallelOldGC 對Full GC啟用并行,當-XX:-UseParallelGC啟用時該項自動啟用 -XX:-UseSerialGC 啟用串行GC -XX:+UseThreadPriorities 啟用本地線程優先級 -XX:-UseG1GC 啟用G1的GC
此類參數,格式:-XX:<name>=<value>
表示屬性name的值為value。在性能調優和調試監測時,會經常用到。
性能調優
性能調優時,主要是對JVM的內存分配情況的調優,包括堆大小,年輕代大小,年輕年老代比例等等。
-XX:LargePageSizeInBytes=4m 設置用于Java堆的大頁面尺寸 -XX:MaxHeapFreeRatio=70 GC后java堆中空閑量占的最大比例 -XX:MaxNewSize=size 新生成對象能占用內存的最大值 -XX:MaxPermSize=64m 老生代對象能占用內存的最大值 -XX:MinHeapFreeRatio=40 GC后java堆中空閑量占的最小比例 -XX:NewRatio=2 新生代內存容量與老生代內存容量的比例 -XX:NewSize=2.125m 新生代對象生成時占用內存的默認值 -XX:ReservedCodeCacheSize=32m 保留代碼占用的內存容量 -XX:ThreadStackSize=512 設置線程棧大小,若為0則使用系統默認值 -XX:+UseLargePages 使用大頁面內存
調試監測
在需要對應用進行監測,特別是觀察GC情況,OOM后檢查問題等。
-XX:-CITime 打印消耗在JIT編譯的時間 -XX:ErrorFile=./hs_err_pid<pid>.log 保存錯誤日志或者數據到文件中 -XX:-ExtendedDTraceProbes 開啟solaris特有的dtrace探針 -XX:HeapDumpPath=./java_pid<pid>.hprof 指定導出堆信息時的路徑或文件名 -XX:-HeapDumpOnOutOfMemoryError 當首次遭遇OOM時導出此時堆中相關信息 -XX:OnError="<cmd args>;<cmd args>" 出現致命ERROR之后運行自定義命令 -XX:OnOutOfMemoryError="<cmd args>;<cmd args>" 當首次遭遇OOM時執行自定義命令 -XX:-PrintClassHistogram 遇到Ctrl-Break后打印類實例的柱狀信息,與jmap -histo功能相同 -XX:-PrintConcurrentLocks 遇到Ctrl-Break后打印并發鎖的相關信息,與jstack -l功能相同 -XX:-PrintCommandLineFlags 打印在命令行中出現過的標記 -XX:-PrintCompilation 當一個方法被編譯時打印相關信息 -XX:-PrintGC 每次GC時打印相關信息 -XX:-PrintGC Details 每次GC時打印詳細信息 -XX:-PrintGCTimeStamps 打印每次GC的時間戳 -XX:-TraceClassLoading 跟蹤類的加載信息 -XX:-TraceClassLoadingPreorder 跟蹤被引用到的所有類的加載信息 -XX:-TraceClassResolution 跟蹤常量池 -XX:-TraceClassUnloading 跟蹤類的卸載信息 -XX:-TraceLoaderConstraints 跟蹤類加載器約束的相關信息
經過前面幾個章節的介紹,大家應該對java的啟動參數(JVM參數)有一定的了解,但參數太多了,不可能把所有參數都得記住,有需要時,建議大家看-help
或者看官網說明來查閱。很多時候,我們只需要記住幾個常用的即可。下面總結一下常用的JVM參數。
-version
,場景:想查看JDK版本,java -version
。
-D<名稱>=<值>
,場景:maven跳過單元測試,使用java -Dmaven.test.skip=true
,
-cp或-classpath
, 場景:設置需要加載的jar包位置,使用java -cp lib/test.jar com.test.TestMain
-verbose:gc
, 場景:輸出GC詳細信息
-Xms<size>
和-Xmx<size>
,場景:由于內存不足發生oom,調大堆大小,如設置為1G,可以java -Xms1024m -Xmx1024m
,通常為了避免頻繁發生GC,-Xms
和-Xmx
設置為一致。
-Xss<size>
,場景:線程操作數及局部變量多,把線程棧的大小調大,可以java -Xss1024k
-Xmn<size>
,場景:年輕代大小設置為512m,可以java -Xmn512m
-Xloggc:file
,場景:將每次GC事件的相關情況記錄到一個文件中以便于后續分析,可以java -Xloggc:logs/gc.log
打印GC相關的內容,包括堆情況,GC詳情,GC時間,發生OOM時,生成快照,發生錯誤是記錄錯誤日志等,如下:
-XX:+PrintHeapAtGC
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+PrintTenuringDistribution
-XX:+PrintGCApplicationStoppedTime
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=logs/heapdump.hprof
,發生OOM時,dump出快照到文件heapdump.hprof
中。
-XX:ErrorFile=logs/java_error_%p.log
,發生JVM錯誤時,把日志輸出到java_error_%p.log
中。
以上參數均是使用度很高的參數,在使用java
命令啟動應用時,可以把這些參數加上,以便于后續調優與問題診斷。
簡單的java啟動命令,使用起來原來這么復雜,當然一般來說,只使用java
或java -jar
來按默認值啟動應用,也不會有太大問題。只是涉及到調優、監測、診斷時,了解這些參數,無疑是高級程序員必要的技能。希望通過本文,大家對java
命令及參數可以做到心中有數。
關于java命令的秘密是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。