1. 程式人生 > >java啟動參數詳解

java啟動參數詳解

restrict sca lar prope user 一次 暫停 jar .sh

java--jvm啟動的參數
其一是標準參數(-),所有的JVM實現都必須實現這些參數的功能,而且向後兼容;
其二是非標準參數(-X),默認jvm實現這些參數的功能,但是並不保證所有jvm實現都滿足,且不保證向後兼容;
其三是非Stable參數(-XX),此類參數各個jvm實現會有所不同,將來可能會隨時取消,需要慎重使用;

? 標準參數中比較有用的:
verbose
-verbose:class
輸出jvm載入類的相關信息,當jvm報告說找不到類或者類沖突時可此進行診斷。
-verbose:gc
輸出每次GC的相關情況。
-verbose:jni
輸出native方法調用的相關情況,一般用於診斷jni調用錯誤信息。

? 非標準參數又稱為擴展參數
一般用到最多的是
-Xms512m: JVM堆內存初始值為512M。
-Xmx512m: JVM堆內存最大可用內存為512M。
-Xmn200m:設置年輕代大小為200M。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小(虛擬機中的共劃分為三個代:年輕代(Young Generation)、年老點(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java類的類信息,與垃圾收集要收集的Java對象關系不大。年輕代和年老代的劃分是對垃圾收集影響比較大的。 )。持久代一般固定大小為64m,所以增大年輕代後,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。

年輕代:
所有新生成的對象首先都是放在年輕代的。年輕代的目標就是盡可能快速的收集掉那些生命周期短的對象。年輕代分三個區。一個Eden區,兩個Survivor區(一般而言)。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被復制到Survivor區(兩個中的一個),當這個Survivor區滿時,此區的存活對象將被復制到另外一個Survivor區,當這個Survivor去也滿了的時候,從第一個Survivor區復制過來的並且此時還存活的對象,將被復制“年老區(Tenured)”。需要註意,Survivor的兩個區是對稱的,沒先後關系,所以同一個區中可能同時存在從Eden復制過來 對象,和從前一個Survivor復制過來的對象,而復制到年老區的只有從第一個Survivor去過來的對象。而且,Survivor區總有一個是空的。同時,根據程序需要,Survivor區是可以配置為多個的(多於兩個),這樣可以增加對象在年輕代中的存在時間,減少被放到年老代的可能。
年老代:
在年輕代中經歷了N次垃圾回收後仍然存活的對象,就會被放到年老代中。因此,可以認為年老代中存放的都是一些生命周期較長的對象。
持久代:
用於存放靜態文件,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應用可能動態生成或者調用一些class,例如Hibernate等,在這種時候需要設置一個比較大的持久代空間來存放這些運行過程中新增的類。持久代大小通過-XX:MaxPermSize=<N>進行設置。
Scavenge GC
一般情況下,當新對象生成,並且在Eden申請空間失敗時,就會觸發Scavenge GC,對Eden區域進行GC,清除非存活對象,並且把尚且存活的對象移動到Survivor區。然後整理Survivor的兩個區。這種方式的GC是對年輕代的Eden區進行,不會影響到年老代。因為大部分對象都是從Eden區開始的,同時Eden區不會分配的很大,所以Eden區的GC會頻繁進行。因而,一般在這裏需要使用速度快、效率高的算法,使Eden去能盡快空閑出來。
Full GC
對整個堆進行整理,包括Young、Tenured和Perm。Full GC因為需要對整個對進行回收,所以比Scavenge GC要慢,因此應該盡可能減少Full GC的次數。在對JVM調優的過程中,很大一部分工作就是對於FullGC的調節。有如下原因可能導致Full GC:
· 年老代(Tenured)被寫滿
· 持久代(Perm)被寫滿
· System.gc()被顯示調用
·上一次GC之後Heap的各域分配策略動態變化

-Xss128k:設置每個線程的堆棧大小。JDK5.0以後每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。根據應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。
-Xloggc:file
與-verbose:gc功能類似,只是將每次GC事件的相關情況記錄到一個文件中,文件的位置最好在本地,以避免網絡的潛在問題。
若與verbose命令同時出現在命令行中,則以-Xloggc為準。
-Xprof
跟蹤正運行的程序,並將跟蹤數據在標準輸出輸出;適合於開發環境調試。
? 非Stable參數
用-XX作為前綴的參數列表在jvm中可能是不健壯的,SUN也不推薦使用,後續可能會在沒有通知的情況下就直接取消了;但是由於這些參數中的確有很多是對我們很有用的,比如我們經常會見到的-XX:PermSize、-XX:MaxPermSize等等;

首先來介紹行為參數:

參數及其默認值 描述
-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:+ ParallelGCThreads JVM在進行並行GC的時候,用於GC的線程數

上面表格中黑體的三個參數代表著jvm中GC執行的三種方式,即串行、並行、並發;
串行(SerialGC)是jvm的默認GC方式,一般適用於小型應用和單處理器,算法比較簡單,GC效率也較高,但可能會給應用帶來停頓;
並行(ParallelGC)是指GC運行時,對應用程序運行沒有影響,GC和app兩者的線程在並發執行,這樣可以最大限度不影響app的運行;
並發(ConcMarkSweepGC)是指多個線程並發執行GC,一般適用於多處理器系統中,可以提高GC的效率,但算法復雜,系統消耗較大;

性能調優參數列表:

參數及其默認值 描述
-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 使用大頁面內存
-XX:+UseCompressedOops 可以壓縮指針,起到節約內存占用的新參數

我們在日常性能調優中基本上都會用到以上黑體的這幾個屬性;

調試參數列表:

參數及其默認值 描述
-XX:-CITime 打印消耗在JIT編譯的時間
-XX:ErrorFile=./hs_err_pid<pid>.log 保存錯誤日誌或者數據到文件中
-XX:-ExtendedDTraceProbes 開啟solaris特有的dtrace探針
-XX:- TraceClassUnloading 用來打印類被加載和卸載的過程信息,這個用來診斷應用的內存泄漏問題非常有用
-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:-PrintGCDetails 每次GC時打印詳細信息
-XX:-PrintGCTimeStamps 打印每次GC的時間戳
-XX:- PrintGCDateStamps 打印每次GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:-TraceClassLoading 跟蹤類的加載信息
-XX:-TraceClassLoadingPreorder 跟蹤被引用到的所有類的加載信息
-XX:-TraceCla***esolution 跟蹤常量池
-XX:-TraceClassUnloading 跟蹤類的卸載信息
-XX:-TraceLoaderConstraints 跟蹤類加載器約束的相關信息
-XX:- UseGCLogFileRotation 啟用GC日誌文件的自動轉儲
-XX:- NumberOfGCLogFiles GC日誌文件的循環數目
-XX:- GCLogFileSize 控制GC日誌文件的大小

jboss啟動配置參數
-c, –configuration=<name> Set the server configuration name
-b, –host=<host or ip> Bind address for all JBoss services
-g, –partition=<name> HA Partition name集群的名稱(default=DefaultDomain)
-u, –udp=<ip> UDP multicast address集群內節點交互的多播地址
-D<name>[=<value>] Set a system property 參數-D設置系統屬性jboss.messaging.ServerPeerId的值,JBoss消息需要這個值在群中要求唯一

JMX(Java Management Extensions,即Java管理擴展)
-Dcom.sun.management.jmxremote.ssl=false
#enable ssl connection (true / false)
#禁止ssl連接
-Dcom.sun.management.jmxremote.authenticate=true
#connection authenticate (true / false)
#開啟用戶認證
-Djava.rmi.server.hostname
#multi eth choose (ip / domain)
#指定hostname 一般情況需要重新指定hostname,否則連接不成功
-Dcom.sun.management.jmxremote.port
#jmx connection remote port
#指定hostname 指定端口默認:1099
-Dcom.sun.management.jmxremote.access.file
#remote access roles (file path)
#訪問模式
-Dcom.sun.management.jmxremote.password.file
#remote authenticate file when authenticate enable (file path)
#認證用戶名密碼
註意:jmxremote.password和jmxremote.access文件只允許啟動用戶名對該文件擁有讀寫權限,我們服務用appsup啟動 所以:
[appsup@ukoclntrtap01u ~]$ ll /usr/java/default/jre/lib/management/
total 28
-rw-r--r--. 1 appsup users 3998 Dec 19 2014 jmxremote.access
-rw-------. 1 appsup users 2854 Jun 13 11:18 jmxremote.password
如果權限設置不正確會報錯:Error: Password file read access must be restricted
-Djava.endorsed.dirs
#可以簡單理解為-Djava.endorsed.dirs指定的目錄裏面放置jar文件,將有覆蓋系統API的功能。可以牽強的理解為,將自己修改後的API打入到虛擬機指定的啟動API中,取而代之。但是能夠覆蓋的類是有限制的,其中不包括java.lang包中的類
-classpath
#參數為目錄下所有jar文件
-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000
#指定rmi調用時gc的時間間隔
#rmi是Java遠程方法調用,即Java RMI(Java Remote Method Invocation)是Java編程語言裏,一種用於實現遠程過程調用的應用程序編程接口。它使客戶機上運行的程序可以調用遠程服務器上的對象。遠程方法調用特性使Java編程人員能夠在網絡環境中分布操作。RMI全部的宗旨就是盡可能簡化遠程接口對象的使用。
-Djava.awt.headless=true
#Headless模式是系統的一種配置模式。在該模式下,系統缺少了顯示設備、鍵盤或鼠標。
-Dsun.lang.ClassLoader.allowArraySyntax=true
#(This property is needed to workaround for the bug 6434149 for JAVA 1.6 ) as it won‘t work without it.
#原來jdk5.0的時候不會報這個錯java.lang.ClassNotFoundException: [Ljava.lang.String,用了jdk6.0就出現了這個錯誤,因為沒有重載java.lang.String這個類
-Doracle.net.tns_admin
#設置JVM的oracle.net.tns_admin的system property
Oracle中TNS的完整定義:transparence Network Substrate透明網絡底層,監聽服務是它重要的一部分,不是全部,不要把TNS當作只是監聽器。
TNS是Oracle Net的一部分,專門用來管理和配置Oracle數據庫和客戶端連接的一個工具,在大多數情況下客戶端和數據庫要通訊,必須配置TNS,當然在少數情況下,不用配置TNS也可以連接Oracle數據庫,比如通過JDBC。如果通過TNS連接Oracle,那麽客戶端必須安裝Oracle client程序。
Oracle當中,如果想訪問某個服務器,必須要設置TNS,它不像SQL SERVER那樣在客戶端自動列舉出在局域網內所有的在線服務器,只需在客戶端選擇需要的服務器,然後使用帳號與密碼登錄即可。而Oracle不能自動列舉出網內的服務器,需要通過讀取TNS配置文件才能列出經過配置的服務器名。
配置文件名一般為:tnsnames.ora,默認路徑:%ORACLE_HOME%\network\admin\tnsnames.ora
-java.net.preferIPv4Stack (default: false)
#If IPv6 is available on the operating system the underlying native socket
will be an IPv6 socket. This allows Java(tm) applications to connect too, and
accept connections from, both IPv4 and IPv6 hosts.
If an application has a preference to only use IPv4 sockets then this
property can be set to true. The implication is that the application will not be
able to communicate with IPv6 hosts.
-Djboss.platform.mbeanserver
讓JBoss EAP 使用jdk的mbean server
MBean通常是一個java類,它提供接口可以使這個類具有管理功能(如standard MBean,接口中定義的方法使MBean具有管理功能)。
MBeanServer是管理MBean的一個java類,你需要向MBean server註冊一個MBean後,這個MBean才會具有管理功能,MBean server還提供了查詢功能和註冊監聽器的功能,sun提供的只是接口,不同的jmx實現中的MBean server實現也不同。
MBeanServer是一個包含所有註冊MBean的倉庫.它是JMX代理層的核心.JMX1.0規範提供一個接口叫 javax.management.MBeanServer. 所有管理的在MBean操作通過MBeanServer執行.使用MBeanServer實例,你能夠管理所有MBean.每一個MBean具有一個唯一標誌,叫ObjectName.
-Djavax.management.builder.initial=org.jboss.system.server.jmx.MBeanServerBuilderImpl
如果是jboss 4.x,在jvm啟動參數中加入-Djboss.platform.mbeanserver就可以了.對於jboss eap 5.x,由於其基於jboss as 5.1,還需要這個參數-Djavax.management.builder.initial=org.jboss.system.server.jmx.MBeanServerBuilderImpl否則啟動就報一堆異常。
-javaagent:/opt/appoptics/appoptics-agent.jar
#會在main方法之前預先執行premain方法
Agent 類必須打成jar包,然後裏面的 META-INF/MAINIFEST.MF 必須包含 Premain-Class這個屬性
-Dorg.jboss.resolver.warning=true
This option warns when an XML entity is defined as SYSTEM with protocol is not "file://" or "vfsfile://", which is most likely something not expected.
-org.jboss.Main
#run.sh中的參數org.jboss.Main
-Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n
-Xrunjdwp
#This option loads the JPDA reference implementation of JDWP. This library resides in the target VM and uses JVMDI and JNI to interact with it. It uses a transport and the JDWP protocol to communicate with a separate debugger application.
dt_socket:使用的通信方式
server:是主動連接調試器還是作為服務器等待調試器連接
suspend:是否在啟動JVM時就暫停,並等待調試器連接
address:地址和端口,地址可以省略,兩者用冒號分隔
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
#JVM 1.5以後的版本應該使用類似上面的命令(老的還是可以使用的),就是一個agentlib就行了,後面的參數都沒有變
-Djboss.modules.system.pkgs=org.jboss.byteman
#This complicates matters for integration with other javaagents which alter the script because this property must also be set and it is not defined in the JVM what precedence is given to multiple same property settings on the command line.
-Djboss.modules.policy-permissions=true
#The Java Security Manager must be enabled for the JBoss application server.
-jaxpmodule javax.xml.jaxp-provider org.jboss.as.standalone
#JAXP(Java API for XMLProcessing,意為XML處理的Java API)是Java XML程序設計的應用程序接口之一,它提供解析和驗證XML文檔的能力。
-Djruby.native.enabled=false
#關閉Ruby
-Djava.library.path=/bin/native
#指定非java類包的位置(如:dll,so)

java啟動參數詳解