為了提高效能,往往需要調整java命令引數,以求系統達到最佳新能。另外這些引數的配置也是影響系統穩定性的一個重要因素,相信大多數Java開發人員都見過“OutOfMemory”型別的錯誤。這其中很可能就是JVM引數配置不當或者就沒有配置沒意識到配置引起的。那麼java命令引數要怎麼設定呢?下面跟yjbys小編一起來看看吧!
Java 在執行已編譯完成的類時,是通過 java 虛擬機器來裝載和執行的,java 虛擬機器通過作業系統命令 JAVA_HOMEbinjava –option 來啟動,-option 為虛擬機器引數,JAVA_HOME 為JDK安裝路徑,通過這些引數可對虛擬機器的執行狀態進行調整,掌握引數的含義可對虛擬機器的執行模式有更深入理解。
一、 檢視引數列表:
虛擬機器引數分為基本和擴充套件兩類,在命令列中輸入 JAVA_HOMEbinjava 就可得到基本引數列表,在命令列輸入 JAVA_HOMEbinjava –X 就可得到擴充套件引數列表。
二、 基本引數說明:
-----------------------------------------------------------------------
D:j2sdk15bin>java
Usage: java [-options] class [args...]
(to execute a class)
or java [-options] -jar jarfile [args...]
(to execute a jar file)
where options include:
-client to select the "client" VM
-server to select the "server" VM
-hotspot is a synonym for the "client" VM [deprecated]
The default VM is client.
-cp
-classpath
A ; separated list of directories, JAR archives,
and ZIP archives to search for class files.
-D
set a system property
-verbose[:class|gc|jni]
enable verbose output
-version print product version and exit
-version:
require the specified version to run
-showversion print product version and continue
-jre-restrict-search | -jre-no-restrict-search
include/exclude user private JREs in the version search
-? -help print this help message
-X print help on non-standard options
-ea[:
-enableassertions[:
enable assertions
-da[:
-disableassertions[:
disable assertions
-esa | -enablesystemassertions
enable system assertions
-dsa | -disablesystemassertions
disable system assertions
-agentlib:[=
load native agent library , e.g. -agentlib:hprof
see also, -agentlib:jdwp=help and -agentlib:hprof=help
-agentpath:
load native agent library by full pathname
-javaagent:
load Java programming language agent, see rument
-----------------------------------------------------------------------
1. -client,-server
這兩個引數用於設定虛擬機器使用何種執行模式,client 模式啟動比較快,但執行時效能和
記憶體管理效率不如 server 模式,通常用於客戶端應用程式。相反,server 模式啟動比 client
慢,但可獲得更高的執行效能。
在 windows上,預設的虛擬機器型別為 client 模式,如果要使用 server模式,就需要在啟動
虛擬機器時加-server 引數,以獲得更高效能,對伺服器端應用,推薦採用 server 模式,尤
其是多個 CPU 的系統。在 Linux,Solaris 上預設採用 server模式。
2. -hotspot
含義與 client 相同,jdk1.4 以前使用的引數,jdk1.4 開始不再使用,代之以 client。
3. -classpath,-cp
虛擬機器在執行一個類時,需要將其裝入記憶體,虛擬機器搜尋類的方式和順序如下:
Bootstrap classes,Extension classes,User classes。
Bootstrap 中的路徑是虛擬機器自帶的 jar 或 zip 檔案,虛擬機器首先搜尋這些包檔案,用
roperty("")可得到虛擬機器搜尋的包名。
Extension 是位於 jrelibext 目錄下的 jar 檔案,虛擬機器在搜尋完 Bootstrap 後就搜尋該
目錄下的 jar 檔案。用 System. getProperty("”)可得到虛擬機器使用
Extension 搜尋路徑。
User classes 搜尋順序為當前目錄、環境變數 CLASSPATH、-classpath。
4. -classpath
告知虛擬機器搜尋目錄名、jar 文件名、zip 文件名,之間用分號;分隔。
例如當你自己開發了公共類幷包裝成一個 包,在使用 中的類時,就
需要用-classpath 告訴虛擬機器從 中查詢該類,否則虛擬機器就會拋
出 assDefFoundError異常,表明未找到類定義。
在執行時可用 roperty(“”)得到虛擬機器查詢類的路徑。
使用-classpath 後虛擬機器將不再使用 CLASSPATH 中的類搜尋路徑,如果-classpath 和
CLASSPATH 都沒有設定,則虛擬機器使用當前路徑(.)作為類搜尋路徑。
推薦使用-classpath 來定義虛擬機器要搜尋的類路徑,而不要使用環境變數 CLASSPATH 的搜
索路徑,以減少多個專案同時使用 CLASSPATH 時存在的潛在衝突。例如應用 1 要使用
中的類 G,應用 2 要使用 中的類 G, 是 的升級包,當
, 都在 CLASSPATH 中,虛擬機器搜尋到第一個包中的類 G 時就停止搜尋,
如果應用1應用2的虛擬機器都從CLASSPATH中搜索,就會有一個應用得不到正確版本的類G。
5. -D
在虛擬機器的系統屬性中設定屬性名/值對,執行在此虛擬機器之上的應用程式可用
當虛擬機器報告類找不到或類衝突時可用此引數來診斷來檢視虛擬機器從裝入類的情況。
7. -verbose:gc
在虛擬機發生記憶體回收時在輸出裝置顯示資訊,格式如下:
[Full GC 268K->168K(1984K), 0.0187390 secs]
該引數用來監視虛擬機器記憶體回收的情況。
8. -verbose:jni
在虛擬機器呼叫 native 方法時輸出裝置顯示資訊,格式如下:
[Dynamic-linking native method ... JNI]
該引數用來監視虛擬機器呼叫本地方法的情況,在發生 jni錯誤時可為診斷提供便利。
9. -version
顯示可執行的虛擬機器版本資訊然後退出。一臺機器上裝有不同版本的 JDK 時
10. -showversion
顯示版本資訊以及幫助資訊。
11. -ea[:
12. -enableassertions[:
從 JDK1.4 開始,java 可支援斷言機制,用於診斷執行時問題。通常在測試階段使斷言有效,
在正式執行時不需要執行斷言。斷言後的表示式的值是一個邏輯值,為 true 時斷言不執行,
為 false 時斷言執行,丟擲 rtionError 錯誤。
上述引數就用來設定虛擬機器是否啟動斷言機制,預設時虛擬機器關閉斷言機制,用-ea 可開啟
斷言機制,不加
某些包或類中的斷言,可將包名或類名加到-ea 之後。例如要啟動包 中的斷
言,可用命令 –ea: 。
13. -da[:
14. -disableassertions[:
用來設定虛擬機器關閉斷言處理,packagename和classname 的使用方法和-ea 相同。
15. -esa | -enablesystemassertions
設定虛擬機器顯示系統類的斷言。
16. -dsa | -disablesystemassertions
設定虛擬機器關閉系統類的斷言。
17. -agentlib:[=
該引數是 JDK5 新引入的,用於虛擬機器裝載本地代理庫。
Libname 為本地代理庫檔名,虛擬機器的搜尋路徑為環境變數 PATH 中的路徑,options 為傳
給本地庫啟動時的.引數,多個引數之間用逗號分隔。在 Windows 平臺上虛擬機器搜尋本地庫名
為 的檔案,在 Unix 上虛擬機器搜尋本地庫名為 的檔案,搜尋路徑環
境變數在不同系統上有所不同,Linux、SunOS、IRIX上為LD_LIBRARY_PATH,AIX上為LIBPATH,
HP-UX 上為SHLIB_PATH。
例如可使用-agentlib:hprof 來獲取虛擬機器的執行情況,包括 CPU、記憶體、執行緒等的執行數
據,並可輸出到指定檔案中,可用-agentlib:hprof=help 來得到使用幫助列表。在 jrebin
目錄下可發現 檔案。
18. -agentpath:
設定虛擬機器按全路徑裝載本地庫,不再搜尋 PATH 中的路徑。其他功能和 agentlib 相同。
19. -javaagent:
虛擬機器啟動時裝入java語言裝置代理。Jarpath檔案中的mainfest檔案必須有Agent-Class
屬性。代理類要實現 public static void premain(String agentArgs, Instrumentation
inst)方法。當虛擬機器初始化時,將按代理類的說明順序呼叫 premain方法。
參見:rument
-----------------------------------------------------------------------
在控制檯輸出資訊中,有個-X(注意是大寫)的命令,這個正是檢視JVM配置引數的命令。
其次,用java -X 命令檢視JVM的配置說明:
執行後如下結果,這些就是配置JVM引數的祕密武器.
-----------------------------------------------------------------------
D:j2sdk15bin>java -X
-Xmixed mixed mode execution (default)
-Xint interpreted mode execution only
-Xbootclasspath:
set search path for bootstrap classes and resources
-Xbootclasspath/a:
append to end of bootstrap class path
-Xbootclasspath/p:
prepend in front of bootstrap class path
-Xnoclassgc disable class garbage collection
-Xincgc enable incremental garbage collection
-Xloggc:
-Xbatch disable background compilation
-Xms
-Xmx
-Xss
-Xprof output cpu profiling data
-Xfuture enable strictest checks, anticipating future default
-Xrs reduce use of OS signals by Java/VM (see documentation)
-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.
The -X options are non-standard and subject to change without notice.
-----------------------------------------------------------------------
JVM配置擴充套件引數說明:
-----------------------------------------------------------------------
1、-Xmixed mixed mode execution (default)
混合模式執行
設定-client 模式虛擬機器對使用頻率高的方式進行 Just-In-Time 編譯和執行,對其他方法
使用解釋方式執行。該方式是虛擬機器預設模式。
2、-Xint interpreted mode execution only
解釋模式執行
設定-client模式下執行的虛擬機器以解釋方式執行類的位元組碼,不將位元組碼編譯為本機碼。
3、-Xbootclasspath:
set search path for bootstrap classes and resources
設定zip/jar資源或者類(s檔案)存放目錄路徑
3、-Xbootclasspath/a:
append to end of bootstrap class path
追加zip/jar資源或者類(s檔案)存放目錄路徑
4、-Xbootclasspath/p:
prepend in front of bootstrap class path
預先載入zip/jar資源或者類(s檔案)存放目錄路徑
改變虛擬機器裝載預設系統執行包 而從-Xbootclasspath 中設定的搜尋路徑中裝載系
統執行類。除非你自己能寫一個執行時,否則不會用到該引數。
/a:將在預設搜尋路徑後加上 path 中的搜尋路徑。
/p:在預設搜尋路徑前先搜尋 path 中的搜尋路徑。
5、-Xnoclassgc disable class garbage collection
關閉類垃圾回收功能
關閉虛擬機器對 class 的垃圾回收功能。
6、-Xincgc enable incremental garbage collection
開啟類的垃圾回收功能
啟動增量垃圾收集器,預設是關閉的。增量垃圾收集器能減少偶然發生的長時間的垃圾回收
造成的暫停時間。但增量垃圾收集器和應用程式併發執行,因此會佔用部分 CPU 在應用程式
上的功能。
7、-Xloggc:
記錄垃圾回日誌到一個檔案。
將虛擬機器每次垃圾回收的資訊寫到日誌檔案中,檔名由 file 指定,檔案格式是平檔案,
內容和-verbose:gc 輸出內容相同。
8、-Xbatch disable background compilation
關閉後臺編譯
虛擬機器的預設執行方式是在後臺編譯類程式碼,然後在前臺執行程式碼,使用-Xbatch引數將關
閉虛擬機器後臺編譯,在前臺編譯完成後再執行
9、-Xms
設定JVM初始化堆記憶體大小
設定虛擬機器可用記憶體堆的初始大小,預設單位為位元組,該大小為 1024 的整數倍並且要大於
1MB,可用 k(K)或m(M)為單位來設定較大的記憶體數。初始堆大小為 2MB。
例如:-Xms6400K,-Xms256M
10、-Xmx
設定JVM最大的堆記憶體大小
設定虛擬機器記憶體堆的最大可用大小,預設單位為位元組。該值必須為 1024 整數倍,並且要大
於 2MB。可用 k(K)或 m(M)為單位來設定較大的記憶體數。預設堆最大值為 64MB。
例如:-Xmx81920K,-Xmx80M
當應用程式申請了大記憶體執行時虛擬機器丟擲 fMemoryError: Java heap
space 錯誤,就需要使用-Xmx 設媒洗蟮目捎媚詿娑選?BR>
11、-Xss
設定JVM棧記憶體大小
設定執行緒棧的大小,預設單位為位元組。與-Xmx 類似,也可用 K 或 M 來設定較大的值。通常
作業系統分配給執行緒棧的預設大小為 1MB。
另外也可在 java 中建立執行緒物件時設定棧的大小,建構函式原型為 Thread(ThreadGroup
group, Runnable target, String name, long stackSize)。
12、-Xprof output cpu profiling data
輸入CPU概要表資料
輸出 CPU 執行時的診斷資訊。
13、-Xfuture enable strictest checks, anticipating future default
執行嚴格的程式碼檢查,預測可能出現的情況
對類檔案進行嚴格格式檢查,以保證類程式碼符合類程式碼規範。為保持向後相容,虛擬機器預設
不進行嚴格的格式檢查。
14、-Xrs reduce use of OS signals by Java/VM (see documentation)
通過JVM還原作業系統訊號
減少虛擬機器中作業系統的訊號(singals)的使用。該引數通常用在虛擬機器以後臺服務方式
執行時使用(如 Servlet)。
15、-Xcheck:jni perform additional checks for JNI functions
呼叫 JNI 函式時進行附加的檢查,特別地虛擬機器將校驗傳遞給 JNI 函式引數的合法性,在本
地程式碼中遇到非法資料時,虛擬機器將報一個致命錯誤而終止。使用該引數後將造成效能下降。
16、-Xshare:off do not attempt to use shared class data
儘可能不去使用共享類的資料
17、-Xshare:auto use shared class data if possible (default)
儘可能的使用共享類的資料
18、-Xshare:on require using shared class data, otherwise fail.
儘可能的使用共享類的資料,否則執行失敗
The -X options are non-standard and subject to change without notice.
-----------------------------------------------------------------------
怎麼用這這些引數呢?其實所有的命令列都是這麼一用,下面我就給出一個最簡單的HelloWorl的例子來演
示這個引數的用法,非常的簡單。
-----------------------------------------------
public class HelloWorld
{
public static void main(String[] args)
{
tln("Hello World!");
}
}
編譯並執行:
D:j2sdk15bin>javac
D:j2sdk15bin>java -Xms256M -Xmx512M HelloWorld
Hello World!
呵呵,這下滿足了吧!
實踐:在大型系統或者應用中配置JVM引數
比如你配置IDE工具的引數,常見的有IDEA、Eclipse,這個是在一個配置檔案中指定即可。
如果你要在J2EE環境中配置這些引數,那麼你需要在J2EE應用伺服器或者Servlet容器相關啟動引數設定處
指定,其啟動檔案中來配置,Tomcat是在中配置,weblogic和websphere是在其他地方,具體
我就說了,相信玩過的這些大型伺服器的人都知道,沒玩過的看看這篇文章,玩玩就知道了,呵呵。
另外常常有人問到jdk的一些相關命令用法,其實,當你看到這裡的時候,你應該知道如何獲取這些命令的
用法了。如果你還不會,那麼,建議你去學學DOS,我是沒轍了。如果你會這些,還是沒有看明白,那麼你
趕緊學學英語吧,這樣你就能看懂了。
另外:我在最後給出常用的幾個Java命令列說明,以供參考:
(1)、javac
用法:javac <選項> <原始檔>
其中,可能的選項包括:
-g 生成所有除錯資訊
-g:none 不生成任何除錯資訊
-g:{lines,vars,source} 只生成某些除錯資訊
-nowarn 不生成任何警告
-verbose 輸出有關編譯器正在執行的操作的訊息
-deprecation 輸出使用已過時的 API 的源位置
-classpath <路徑> 指定查詢使用者類檔案的位置
-cp <路徑> 指定查詢使用者類檔案的位置
-sourcepath <路徑> 指定查詢輸入原始檔的位置
-bootclasspath <路徑> 覆蓋引導類檔案的位置
-extdirs <目錄> 覆蓋安裝的擴充套件目錄的位置
-endorseddirs <目錄> 覆蓋簽名的標準路徑的位置
-d <目錄> 指定存放生成的類檔案的位置
-encoding <編碼> 指定原始檔使用的字元編碼
-source <版本> 提供與指定版本的源相容性
-target <版本> 生成特定 VM 版本的類檔案
-version 版本資訊
-help 輸出標準選項的提要
-X 輸出非標準選項的提要
-J<標誌> 直接將 <標誌> 傳遞給執行時系統
(2)、jar
用法:jar {ctxu}[vfm0Mi] [jar-檔案] [manifest-檔案] [-C 目錄] 檔名 ...
選項:
-c 建立新的存檔
-t 列出存檔內容的列表
-x 展開存檔中的命名的(或所有的〕檔案
-u 更新已存在的存檔
-v 生成詳細輸出到標準輸出上
-f 指定存檔檔名
-m 包含來自標明檔案的標明資訊
-0 只儲存方式;未用ZIP壓縮格式
-M 不產生所有項的清單(manifest〕檔案
-i 為指定的jar檔案產生索引資訊
-C 改變到指定的目錄,並且包含下列檔案:
如果一個檔名是一個目錄,它將被遞迴處理。
清單(manifest〕檔名和存檔檔名都需要被指定,按'm' 和 'f'標誌指定的相同順序。
示例1:將兩個class檔案存檔到一個名為 '' 的存檔檔案中:
jar cvf s s
示例2:用一個存在的清單(manifest)檔案 'mymanifest' 將 foo/ 目錄下的所有
檔案存檔到一個名為 '' 的存檔檔案中:
jar cvfm mymanifest -C foo/ .
(3)、javadoc
javadoc: 錯誤 - 未指定軟體包或類。
用法:javadoc [選項] [軟體包名稱] [原始檔] [@file]
-overview <檔案> 讀取 HTML 檔案的概述文件
-public 僅顯示公共類和成員
-protected 顯示受保護/公共類和成員(預設)
-package 顯示軟體包/受保護/公共類和成員
-private 顯示所有類和成員
-help 顯示命令列選項並退出
-doclet <類> 通過替代 doclet 生成輸出
-docletpath <路徑> 指定查詢 doclet 類檔案的位置
-sourcepath <路徑列表> 指定查詢原始檔的位置
-classpath <路徑列表> 指定查詢使用者類檔案的位置
-exclude <軟體包列表> 指定要排除的軟體包的列表
-subpackages <子軟體包列表> 指定要遞迴裝入的子軟體包
-breakiterator 使用 BreakIterator 計算第 1 句
-bootclasspath <路徑列表> 覆蓋引導類載入器所裝入的
類檔案的位置
-source <版本> 提供與指定版本的源相容性
-extdirs <目錄列表> 覆蓋安裝的擴充套件目錄的位置
-verbose 輸出有關 Javadoc 正在執行的操作的訊息
-locale <名稱> 要使用的語言環境,例如 en_US 或 en_US_WIN
-encoding <名稱> 原始檔編碼名稱
-quiet 不顯示狀態訊息
-J<標誌> 直接將 <標誌> 傳遞給執行時系統
通過標準 doclet 提供:
-d <目錄> 輸出檔案的目標目錄
-use 建立類和軟體包用法頁面
-version 包含 @version 段
-author 包含 @author 段
-docfilessubdirs 遞迴複製文件檔案子目錄
-splitindex 將索引分為每個字母對應一個檔案
-windowtitle <文字> 文件的瀏覽器視窗標題
-doctitle 包含概述頁面的標題
-header 包含每個頁面的頁首文字
-footer 包含每個頁面的頁尾文字
-bottom 包含每個頁面的底部文字
-link
-linkoffline
的文件
-excludedocfilessubdir <名稱 1>:..排除帶有給定名稱的所有文件檔案子目錄。
-group <名稱>
-nocomment 抑止描述和標記,只生成宣告。
-nodeprecated 不包含 @deprecated 資訊
-noqualifier <名稱 1>:<名稱 2>:...從輸出中排除限定符的列表。
-nosince 不包含 @since 資訊
-notimestamp 不包含隱藏時間戳
-nodeprecatedlist 不生成已過時的列表
-notree 不生成類分層結構
-noindex 不生成索引
-nohelp 不生成幫助連結
-nonavbar 不生成導航欄
-serialwarn 生成有關 @serial 標記的警告
-tag <名稱>:<位置>:<標題> 指定單個變數自定義標記
-taglet 要註冊的 Taglet 的全限定名稱
-tagletpath Taglet 的路徑
-charset <字符集> 用於跨平臺檢視生成的文件的字符集。
-helpfile <檔案> 包含幫助連結所連結到的檔案
-linksource 以 HTML 格式生成源
-sourcetab <製表符長度> 指定源中每個製表符佔據的空格數
-keywords 使軟體包、類和成員資訊附帶 HTML 元標記
-stylesheetfile <路徑> 用於更改生成文件的樣式的檔案
-docencoding <名稱> 輸出編碼名稱
(4)、rmid
rmid: 非法選項:-?
用法:rmid
其中,
-port
-log
-stop 停止當前的 rmid 呼叫(對指定埠)
-C
-J