天天看點

Java虛拟機(JVM)參數配置說明

在Java、J2EE大型應用中,JVM非标準參數的配置直接關系到整個系統的性能。

JVM非标準參數指的是JVM底層的一些配置參數,這些參數在一般開發中預設即可,不需要任何配置。但是在生産環境中,為了提高性能,往往需要調整這些參數,以求系統達到最佳新能。

另外這些參數的配置也是影響系統穩定性的一個重要因素,相信大多數Java開發人員都見過“OutOfMemory”類型的錯誤。呵呵,這其中很可能就是JVM參數配置不當或者就沒有配置沒意識到配置引起的。

為了說明這些參數,還需要說說JDK中的指令行工具一些知識做鋪墊。

首先看如何擷取這些指令配置資訊說明:

假設你是windows平台,你安裝了J2SDK,那麼現在你從cmd控制台視窗進入J2SDK安裝目錄下的bin目錄,然後運作java指令,出現如下結果,這些就是包括java.exe工具的和JVM的所有指令都在裡面。

-----------------------------------------------------------------------

D:\j2sdk15\bin>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 <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>

                  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[:<packagename>...|:<classname>]

    -enableassertions[:<packagename>...|:<classname>]

                  enable assertions

    -da[:<packagename>...|:<classname>]

    -disableassertions[:<packagename>...|:<classname>]

                  disable assertions

    -esa | -enablesystemassertions

                  enable system assertions

    -dsa | -disablesystemassertions

                  disable system assertions

    -agentlib:<libname>[=<options>]

                  load native agent library <libname>, e.g. -agentlib:hprof

                    see 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

在控制台輸出資訊中,有個-X(注意是大寫)的指令,這個正是檢視JVM配置參數的指令。

其次,用java -X 指令檢視JVM的配置說明:

運作後如下結果,這些就是配置JVM參數的秘密武器,這些資訊都是英文的,為了友善閱讀,我根據自己的了解翻譯成中文了(不準确的地方還請各位博友斧正)

D:\j2sdk15\bin>java -X

    -Xmixed           mixed mode execution (default)

    -Xint             interpreted mode execution only

    -Xbootclasspath:<directories and zip/jar files separated by ;>

                      set search path for bootstrap classes and resources

    -Xbootclasspath/a:<directories and zip/jar files separated by ;>

                      append to end of bootstrap class path

    -Xbootclasspath/p:<directories and zip/jar files separated by ;>

                      prepend in front of bootstrap class path

    -Xnoclassgc       disable class garbage collection

    -Xincgc           enable incremental garbage collection

    -Xloggc:<file>    log GC status to a file with time stamps

    -Xbatch           disable background compilation

    -Xms<size>        set initial Java heap size

    -Xmx<size>        set maximum Java heap size

    -Xss<size>        set java thread stack size

    -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)

 混合模式執行

2、-Xint             interpreted mode execution only

 解釋模式執行

3、-Xbootclasspath:<directories and zip/jar files separated by ;>

      set search path for bootstrap classes and resources

 設定zip/jar資源或者類(.class檔案)存放目錄路徑

3、-Xbootclasspath/a:<directories and zip/jar files separated by ;>

      append to end of bootstrap class path

 追加zip/jar資源或者類(.class檔案)存放目錄路徑

4、-Xbootclasspath/p:<directories and zip/jar files separated by ;>

      prepend in front of bootstrap class path

 預先加載zip/jar資源或者類(.class檔案)存放目錄路徑

5、-Xnoclassgc       disable class garbage collection

 關閉類垃圾回收功能

6、-Xincgc           enable incremental garbage collection

 開啟類的垃圾回收功能

7、-Xloggc:<file>    log GC status to a file with time stamps

 記錄垃圾回日志到一個檔案。

8、-Xbatch           disable background compilation

 關閉背景編譯

9、-Xms<size>        set initial Java heap size

 設定JVM初始化堆記憶體大小

10、-Xmx<size>        set maximum Java heap size

 設定JVM最大的堆記憶體大小

11、-Xss<size>        set java thread stack size

 設定JVM棧記憶體大小

12、-Xprof            output cpu profiling data

 輸入CPU概要表資料

13、-Xfuture          enable strictest checks, anticipating future default

 執行嚴格的代碼檢查,預測可能出現的情況

14、-Xrs              reduce use of OS signals by Java/VM (see documentation)

 通過JVM還原作業系統信号

15、-Xcheck:jni       perform additional checks for JNI functions

 對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.

 盡可能的使用共享類的資料,否則運作失敗

怎麼用這這些參數呢?其實所有的指令行都是這麼一用,下面我就給出一個最簡單的HelloWorl的例子來示範這個參數的用法,非常的簡單。

HelloWorld.java

-----------------------------------------------

public class  HelloWorld

{

 public static void main(String[] args)

 {

  System.out.println("Hello World!");

 }

}

編譯并運作:

D:\j2sdk15\bin>javac HelloWorld.java

D:\j2sdk15\bin>java -Xms256M -Xmx512M HelloWorld

Hello World!

呵呵,這下滿足了吧!

實踐:在大型系統或者應用中配置JVM參數

比如你配置IDE工具的參數,常見的有IDEA、Eclipse,這個是在一個配置檔案中指定即可。

如果你要在J2EE環境中配置這些參數,那麼你需要在J2EE應用伺服器或者Servlet容器相關啟動參數設定處指定,其啟動檔案中來配置,Tomcat是在catalina.bat中配置,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檔案存檔到一個名為 'classes.jar' 的存檔檔案中:

       jar cvf classes.jar Foo.class Bar.class

示例2:用一個存在的清單(manifest)檔案 'mymanifest' 将 foo/ 目錄下的所有

           檔案存檔到一個名為 'classes.jar' 的存檔檔案中:

       jar cvfm classes.jar 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 <html 代碼>             包含概述頁面的标題

-header <html 代碼>               包含每個頁面的頁眉文本

-footer <html 代碼>               包含每個頁面的頁腳文本

-bottom <html 代碼>               包含每個頁面的底部文本

-link <url>                       建立指向位于 <url> 的 javadoc 輸出的連結

-linkoffline <url> <url2>         利用位于 <url2> 的軟體包清單連結至位于 <url>

的文檔

-excludedocfilessubdir <名稱 1>:..排除帶有給定名稱的所有文檔檔案子目錄。

-group <名稱> <p1>:<p2>..         在概述頁面中,将指定的軟體包分組

-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 <option>

其中,<option> 包括:

  -port <option>        指定供 rmid 使用的端口

  -log <directory>    指定 rmid 将日志寫入的目錄

  -stop               停止目前的 rmid 調用(對指定端口)

  -C<runtime 标記>    向每個子程序傳遞參數(激活組)

  -J<runtime 标記>    向 java 解釋程式傳遞參數

本文轉自 leizhimin 51CTO部落格,原文連結:http://blog.51cto.com/lavasoft/25492,如需轉載請自行聯系原作者