真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java命令的秘密是什么

java命令的秘密是什么,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)憑借專業(yè)的設(shè)計(jì)團(tuán)隊(duì)扎實(shí)的技術(shù)支持、優(yōu)質(zhì)高效的服務(wù)意識(shí)和豐厚的資源優(yōu)勢(shì),提供專業(yè)的網(wǎng)站策劃、網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站優(yōu)化、軟件開發(fā)、網(wǎng)站改版等服務(wù),在成都十多年的網(wǎng)站建設(shè)設(shè)計(jì)經(jīng)驗(yàn),為成都上千家中小型企業(yè)策劃設(shè)計(jì)了網(wǎng)站。

一句話概括:簡(jiǎn)單的java啟動(dòng)命令,原來藏著這么多秘密,本文為你揭曉。

1 引言

剛開始學(xué)java的同學(xué),一定都不會(huì)忘記安裝完jdk后,都會(huì)使用java -version命令來檢測(cè)一下是否安裝成功,那還有沒有其它參數(shù)可以使用呢?平時(shí)開發(fā)和運(yùn)行java應(yīng)用時(shí),經(jīng)??吹揭恍?code>-D的參數(shù)(如使用maven時(shí),package時(shí)會(huì)使用-Dmaven.test.skip),這些參數(shù)是用來做什么的?還有經(jīng)常說到調(diào)優(yōu),都會(huì)涉及到-Xms-Xmx的設(shè)置,它是什么意思呢?這些,基本都是在使用java命令啟動(dòng)應(yīng)用時(shí)所使用的參數(shù),它的參數(shù)有很多,特別涉及到應(yīng)用調(diào)優(yōu)和問題診斷時(shí)會(huì)經(jīng)常使用,學(xué)習(xí)java的同學(xué)都應(yīng)該了解一下。本文將對(duì)java命令的啟動(dòng)參數(shù)進(jìn)行詳細(xì)描述,著重講解常用的設(shè)置及用于調(diào)試監(jiān)測(cè)的設(shè)置。

2 java應(yīng)用啟動(dòng)

啟動(dòng)java應(yīng)用使用的是java(class文件)或java -jar(jar或war包)命令,java命令其實(shí)就是生成一個(gè)JVM的實(shí)例,java應(yīng)用則運(yùn)行于此JVM實(shí)例中,JVM負(fù)責(zé)類加載,運(yùn)行時(shí)區(qū)域堆棧分配等工作,當(dāng)應(yīng)用退出,JVM實(shí)例也會(huì)關(guān)閉。啟動(dòng)多個(gè)java應(yīng)用,也會(huì)啟動(dòng)多個(gè)JVM實(shí)例,它們不會(huì)相互影響(但它們都共享同一系統(tǒng)的資源),這也是為什么使用一個(gè)JDK,可以跑多個(gè)java應(yīng)用的背后邏輯。使用java命令啟動(dòng)應(yīng)用所使用的參數(shù),基本是用于JVM的,JVM實(shí)例通過調(diào)用某個(gè)初始類的main()方法來運(yùn)行一個(gè)Java程序,此方法將作為該程序初始線程的起點(diǎn),任何其他的線程都是由這個(gè)初始線程啟動(dòng)的。在JVM內(nèi)部有兩種線程:守護(hù)線程(如垃圾回收線程)和非守護(hù)線程(main方法線程及用戶使用Thread創(chuàng)建的線程),當(dāng)該程序中所有的非守護(hù)線程都終止時(shí),JVM實(shí)例將自動(dòng)退出。

3 java應(yīng)用啟動(dòng)參數(shù)說明

java命令究竟有哪些參數(shù)可以用,這些參數(shù)分別有什么作用,簡(jiǎn)單的不帶參數(shù)使用javajava -helpjava -?,即可看到此命令的使用方法及參數(shù)描述,如下所示:

java命令的秘密是什么

java執(zhí)行類文件,java -jar執(zhí)行jarwar文件。上面只是把參數(shù)簡(jiǎn)要的列了出來,更詳細(xì)的參數(shù)說明,可參考官網(wǎng)的java命令說明(https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html)。使用java命令啟動(dòng)應(yīng)用所使用的參數(shù),基本是用于JVM的,某種程度上也叫做JVM參數(shù)??偟膩碚f,java啟動(dòng)參數(shù)共分為三大類,分別是:

  • 標(biāo)準(zhǔn)參數(shù)(-):相對(duì)穩(wěn)定的參數(shù),每個(gè)版本的JVM都可用。

  • 非標(biāo)準(zhǔn)X參數(shù)(-X):默認(rèn)jvm實(shí)現(xiàn)這些參數(shù)的功能,但是并不保證所有jvm實(shí)現(xiàn)都滿足,且不保證向后兼容。

  • XX參數(shù)(-XX):此類參數(shù)各個(gè)jvm實(shí)現(xiàn)會(huì)有所不同,將來可能會(huì)隨時(shí)取消。

下面將會(huì)對(duì)這些參數(shù)進(jìn)行說明。

3.1 標(biāo)準(zhǔn)參數(shù)(-)

從前面使用java -?可以看到,以-開頭的參數(shù),都屬于標(biāo)準(zhǔn)參數(shù),我們常用的-help-version,-classpath-Dproperty=value等均屬于標(biāo)準(zhǔn)參數(shù)。參數(shù)詳細(xì)說明如下:

-d32及-d64  分別表示應(yīng)用運(yùn)行在32位或64位的環(huán)境中,使用Java HotSpot Server VM的默認(rèn)使用的是server模式,而server模式默認(rèn)使用的是-d64,因此在沒有使用此參數(shù)時(shí),默認(rèn)就是-d64。

-server       選擇 "server" VM,默認(rèn) VM 是 server,表示是在服務(wù)器類計(jì)算機(jī)上運(yùn)行。

-cp或-classpath <目錄和 zip/jar 文件的類搜索路徑>linux用":",windows用";"來分隔目錄, JAR 檔案和 ZIP 檔案列表, 用于搜索類文件。
      使用-classpath后jvm將不再使用CLASSPATH中的類搜索路徑,如果-classpath和CLASSPATH都沒有設(shè)置,則jvm使用當(dāng)前路徑(.)作為類搜索路徑。

-D<名稱>=<值> 設(shè)置系統(tǒng)屬性,運(yùn)行在此jvm之上的應(yīng)用程序可用System.getProperty(“property”)得到value的值。
      如果value中有空格,則需要用雙引號(hào)將該值括起來,如-Dfoo=”foo bar”。該參數(shù)通常用于設(shè)置系統(tǒng)級(jí)全局變量值,如配置文件路徑,以便該屬性在程序中任何地方都可訪問。

-verbose:[class|gc|jni] 啟用詳細(xì)輸出,一般在調(diào)試和診斷時(shí),都會(huì)把gc的詳細(xì)信息輸出
-version      輸出產(chǎn)品版本并退出
-version:<值> 需要指定的版本才能運(yùn)行
-showversion  輸出產(chǎn)品版本并繼續(xù),即輸出版本后,繼續(xù)按java執(zhí)行,這是跟-version的區(qū)別
-jre-restrict-search | -no-jre-restrict-search 在版本搜索中包括/排除用戶專用 JRE
-? -help      輸出此幫助消息
-X            輸出非標(biāo)準(zhǔn)選項(xiàng)的幫助
-ea或-enableassertions [:...|:] 按指定的粒度啟用斷言,默認(rèn)jvm關(guān)閉斷言機(jī)制
-da或-disableassertions [:...|:] 禁用具有指定粒度的斷言
-esa | -enablesystemassertions 啟用系統(tǒng)斷言
-dsa | -disablesystemassertions 禁用系統(tǒng)斷言
-agentlib:[=<選項(xiàng)>] 加載本機(jī)代理庫(kù) , 例如 -agentlib:hprof
                  另請(qǐng)參閱 -agentlib:jdwp=help 和 -agentlib:hprof=help
-agentpath:[=<選項(xiàng)>] 按完整路徑名加載本機(jī)代理庫(kù)
-javaagent:[=<選項(xiàng)>] 加載Java編程語(yǔ)言代理, 請(qǐng)參閱 java.lang.instrument
-splash: 使用指定的圖像顯示啟動(dòng)屏幕,一般用于圖形編程。

由上面描述可,可知道我們常用的-version-classpath,-Dproperty=value是用于做什么的了。特別提一下-classpath(以前遇到由于這個(gè)導(dǎo)致運(yùn)行問題),jvm在加載類時(shí),搜索的路徑就是此路徑,而它在linux及windows使用的分隔符是不一樣的,linux用:,windows用;來分隔。

3.2 非標(biāo)準(zhǔn)X參數(shù)(-X)

使用命令java -X,即可把非標(biāo)準(zhǔn)參數(shù)輸出,平時(shí)使用中,我們用得較多的就是-Xloggc-Xms,-Xmx,-Xss,-Xmn了,詳細(xì)說明如下所示:

-Xmixed  默認(rèn)是mixed,使用它們來設(shè)置JVM的本地代碼編譯模式
-Xint    表示解釋執(zhí)行,所有的字節(jié)碼將被直接執(zhí)行,而不會(huì)編譯成本地碼
-Xcomp   表示第一次使用就編譯成本地代碼。
-Xbatch  禁止后臺(tái)代碼編譯,強(qiáng)制在前臺(tái)編譯,編譯完成之后才能進(jìn)行代碼執(zhí)行,默認(rèn)情況下,jvm在后臺(tái)進(jìn)行編譯,若沒有編譯完成,則前臺(tái)運(yùn)行代碼時(shí)以解釋模式運(yùn)行
-Xbootclasspath:    設(shè)置搜索路徑以引導(dǎo)類和資源,讓jvm從指定路徑(可以是分號(hào)分隔的目錄、jar、或者zip)中加載bootclass,用來替換jdk的rt.jar
-Xbootclasspath/a:  附加在引導(dǎo)類路徑末尾
-Xbootclasspath/p:  置于引導(dǎo)類路徑之前,讓jvm優(yōu)先于bootstrap默認(rèn)路徑加載指定路徑的所有文件
-Xcheck:jni    對(duì)JNI函數(shù)進(jìn)行附加check;此時(shí)jvm將校驗(yàn)傳遞給JNI函數(shù)參數(shù)的合法性,在本地代碼中遇到非法數(shù)據(jù)時(shí),jmv將報(bào)一個(gè)致命錯(cuò)誤而終止;使用該參數(shù)后將造成性能下降,請(qǐng)慎用。
-Xfuture   讓jvm對(duì)類文件執(zhí)行嚴(yán)格的格式檢查(默認(rèn)jvm不進(jìn)行嚴(yán)格格式檢查),以符合類文件格式規(guī)范,推薦開發(fā)人員使用該參數(shù)
-Xincgc    開啟增量gc(默認(rèn)為關(guān)閉);這有助于減少長(zhǎng)時(shí)間GC時(shí)應(yīng)用程序出現(xiàn)的停頓;但由于可能和應(yīng)用程序并發(fā)執(zhí)行,所以會(huì)降低CPU對(duì)應(yīng)用的處理能力
-Xloggc:file   與-verbose:gc功能類似,只是將每次GC事件的相關(guān)情況記錄到一個(gè)文件中,文件的位置最好在本地,以避免網(wǎng)絡(luò)的潛在問題。若與verbose命令同時(shí)出現(xiàn)在命令行中,則以-Xloggc為準(zhǔn)。
-Xms   指定jvm堆的初始大小,默認(rèn)為物理內(nèi)存的1/64,最小為1M;可以指定單位,比如k、m,若不指定,則默認(rèn)為字節(jié)。
-Xmx   指定jvm堆的最大值,默認(rèn)為物理內(nèi)存的1/4或者1G,最小為2M;單位與-Xms一致。
-Xss   設(shè)置單個(gè)線程棧的大小,一般默認(rèn)為512k。
-Xmn   設(shè)置堆(heap)的年輕代的初始值及最大值,單位與-Xms一致,年輕代是存儲(chǔ)新對(duì)象的地址,也是GC發(fā)生得最頻繁的地方,若設(shè)置過小,則會(huì)容易觸發(fā)年輕代垃圾回收(minor gc),若設(shè)置過大,只觸發(fā)full gc,則占用時(shí)間會(huì)很長(zhǎng),oracle建議是把年輕代設(shè)置在堆大小的四份之一到一半的。這命令同時(shí)設(shè)置了初始值和最大值,可以使用-XX:NewSize和-XX:MaxNewSiz來分別設(shè)置。
-XshowSettings    顯示所有設(shè)置并繼續(xù)

上述參數(shù)中,-Xms,-Xmx,-Xss,-Xmn都是我們性能優(yōu)化中很重要的參數(shù),-Xloggc是在沒有專業(yè)跟蹤工具情況下排錯(cuò)的好手。

3.3 XX參數(shù)(-XX)

此類參數(shù)非常豐富,包括高級(jí)運(yùn)行時(shí)參數(shù),高級(jí)JIT編譯參數(shù),高級(jí)維護(hù)參數(shù)和高級(jí)GC參數(shù),在官網(wǎng)可以看到它全部的參數(shù)(https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html),各個(gè)版本jvm實(shí)現(xiàn)有可能會(huì)有所不同。其中按設(shè)置格式,主要分為兩類,一種是boolean類型,主要用于功能開關(guān),一種是key-value類型,主要性能、調(diào)試參數(shù)等設(shè)置,下面列舉一些主要使用的參數(shù)。

3.3.1 boolean類型

此類參數(shù),格式:-XX:[+-],作為功能開關(guān),表示啟用或者禁用屬性。以下列舉一些:

-XX:+PrintFlagsFinal  輸出參數(shù)的最終值
-XX:+PrintFlagsInitial 輸出參數(shù)的默認(rèn)值
-XX:-DisableExplicitGC  禁止調(diào)用System.gc();但jvm的gc仍然有效
-XX:+MaxFDLimit 最大化文件描述符的數(shù)量限制
-XX:+ScavengeBeforeFullGC   新生代GC優(yōu)先于Full GC執(zhí)行
-XX:+UseGCOverheadLimit 在拋出OOM之前限制jvm耗費(fèi)在GC上的時(shí)間比例
-XX:-UseConcMarkSweepGC 對(duì)老生代采用并發(fā)標(biāo)記交換算法進(jìn)行GC
-XX:-UseParallelGC  啟用并行GC
-XX:-UseParallelOldGC   對(duì)Full GC啟用并行,當(dāng)-XX:-UseParallelGC啟用時(shí)該項(xiàng)自動(dòng)啟用
-XX:-UseSerialGC    啟用串行GC
-XX:+UseThreadPriorities    啟用本地線程優(yōu)先級(jí)
-XX:-UseG1GC    啟用G1的GC

3.3.2 key-value類型

此類參數(shù),格式:-XX:=表示屬性name的值為value。在性能調(diào)優(yōu)和調(diào)試監(jiān)測(cè)時(shí),會(huì)經(jīng)常用到。

  • 性能調(diào)優(yōu)

性能調(diào)優(yōu)時(shí),主要是對(duì)JVM的內(nèi)存分配情況的調(diào)優(yōu),包括堆大小,年輕代大小,年輕年老代比例等等。

-XX:LargePageSizeInBytes=4m 設(shè)置用于Java堆的大頁(yè)面尺寸
-XX:MaxHeapFreeRatio=70 GC后java堆中空閑量占的最大比例
-XX:MaxNewSize=size 新生成對(duì)象能占用內(nèi)存的最大值
-XX:MaxPermSize=64m 老生代對(duì)象能占用內(nèi)存的最大值
-XX:MinHeapFreeRatio=40 GC后java堆中空閑量占的最小比例
-XX:NewRatio=2  新生代內(nèi)存容量與老生代內(nèi)存容量的比例
-XX:NewSize=2.125m  新生代對(duì)象生成時(shí)占用內(nèi)存的默認(rèn)值
-XX:ReservedCodeCacheSize=32m   保留代碼占用的內(nèi)存容量
-XX:ThreadStackSize=512 設(shè)置線程棧大小,若為0則使用系統(tǒng)默認(rèn)值
-XX:+UseLargePages  使用大頁(yè)面內(nèi)存
  • 調(diào)試監(jiān)測(cè)

在需要對(duì)應(yīng)用進(jìn)行監(jiān)測(cè),特別是觀察GC情況,OOM后檢查問題等。

-XX:-CITime 打印消耗在JIT編譯的時(shí)間
-XX:ErrorFile=./hs_err_pid.log 保存錯(cuò)誤日志或者數(shù)據(jù)到文件中
-XX:-ExtendedDTraceProbes   開啟solaris特有的dtrace探針
-XX:HeapDumpPath=./java_pid.hprof  指定導(dǎo)出堆信息時(shí)的路徑或文件名
-XX:-HeapDumpOnOutOfMemoryError 當(dāng)首次遭遇OOM時(shí)導(dǎo)出此時(shí)堆中相關(guān)信息
-XX:OnError=";" 出現(xiàn)致命ERROR之后運(yùn)行自定義命令
-XX:OnOutOfMemoryError=";"  當(dāng)首次遭遇OOM時(shí)執(zhí)行自定義命令
-XX:-PrintClassHistogram    遇到Ctrl-Break后打印類實(shí)例的柱狀信息,與jmap -histo功能相同
-XX:-PrintConcurrentLocks   遇到Ctrl-Break后打印并發(fā)鎖的相關(guān)信息,與jstack -l功能相同
-XX:-PrintCommandLineFlags  打印在命令行中出現(xiàn)過的標(biāo)記
-XX:-PrintCompilation   當(dāng)一個(gè)方法被編譯時(shí)打印相關(guān)信息
-XX:-PrintGC    每次GC時(shí)打印相關(guān)信息
-XX:-PrintGC Details    每次GC時(shí)打印詳細(xì)信息
-XX:-PrintGCTimeStamps  打印每次GC的時(shí)間戳
-XX:-TraceClassLoading  跟蹤類的加載信息
-XX:-TraceClassLoadingPreorder  跟蹤被引用到的所有類的加載信息
-XX:-TraceClassResolution   跟蹤常量池
-XX:-TraceClassUnloading    跟蹤類的卸載信息
-XX:-TraceLoaderConstraints 跟蹤類加載器約束的相關(guān)信息

4 常用java應(yīng)用啟動(dòng)參數(shù)

經(jīng)過前面幾個(gè)章節(jié)的介紹,大家應(yīng)該對(duì)java的啟動(dòng)參數(shù)(JVM參數(shù))有一定的了解,但參數(shù)太多了,不可能把所有參數(shù)都得記住,有需要時(shí),建議大家看-help或者看官網(wǎng)說明來查閱。很多時(shí)候,我們只需要記住幾個(gè)常用的即可。下面總結(jié)一下常用的JVM參數(shù)。

4.1 常用標(biāo)準(zhǔn)參數(shù)

  • -version,場(chǎng)景:想查看JDK版本,java -version

  • -D<名稱>=<值>,場(chǎng)景:maven跳過單元測(cè)試,使用java -Dmaven.test.skip=true,

  • -cp或-classpath, 場(chǎng)景:設(shè)置需要加載的jar包位置,使用java -cp lib/test.jar com.test.TestMain

  • -verbose:gc, 場(chǎng)景:輸出GC詳細(xì)信息

4.2 常用X參數(shù)

  • -Xms-Xmx,場(chǎng)景:由于內(nèi)存不足發(fā)生oom,調(diào)大堆大小,如設(shè)置為1G,可以java -Xms1024m -Xmx1024m,通常為了避免頻繁發(fā)生GC,-Xms-Xmx設(shè)置為一致。

  • -Xss,場(chǎng)景:線程操作數(shù)及局部變量多,把線程棧的大小調(diào)大,可以java -Xss1024k

  • -Xmn,場(chǎng)景:年輕代大小設(shè)置為512m,可以java -Xmn512m

  • -Xloggc:file,場(chǎng)景:將每次GC事件的相關(guān)情況記錄到一個(gè)文件中以便于后續(xù)分析,可以java -Xloggc:logs/gc.log

4.3 常用XX參數(shù)

打印GC相關(guān)的內(nèi)容,包括堆情況,GC詳情,GC時(shí)間,發(fā)生OOM時(shí),生成快照,發(fā)生錯(cuò)誤是記錄錯(cuò)誤日志等,如下:

  • -XX:+PrintHeapAtGC

  • -XX:+PrintGCDetails

  • -XX:+PrintGCDateStamps

  • -XX:+PrintGCTimeStamps

  • -XX:+PrintTenuringDistribution

  • -XX:+PrintGCApplicationStoppedTime

  • -XX:+HeapDumpOnOutOfMemoryError

  • -XX:HeapDumpPath=logs/heapdump.hprof,發(fā)生OOM時(shí),dump出快照到文件heapdump.hprof中。

  • -XX:ErrorFile=logs/java_error_%p.log,發(fā)生JVM錯(cuò)誤時(shí),把日志輸出到java_error_%p.log中。

以上參數(shù)均是使用度很高的參數(shù),在使用java命令啟動(dòng)應(yīng)用時(shí),可以把這些參數(shù)加上,以便于后續(xù)調(diào)優(yōu)與問題診斷。

5 總結(jié)

簡(jiǎn)單的java啟動(dòng)命令,使用起來原來這么復(fù)雜,當(dāng)然一般來說,只使用javajava -jar來按默認(rèn)值啟動(dòng)應(yīng)用,也不會(huì)有太大問題。只是涉及到調(diào)優(yōu)、監(jiān)測(cè)、診斷時(shí),了解這些參數(shù),無疑是高級(jí)程序員必要的技能。希望通過本文,大家對(duì)java命令及參數(shù)可以做到心中有數(shù)。

關(guān)于java命令的秘密是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


當(dāng)前標(biāo)題:java命令的秘密是什么
轉(zhuǎn)載注明:http://weahome.cn/article/iheohc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部