java啟動參數詳解

來源:互聯網
上載者:User

標籤:oracle資料庫   round   相同   nic   監聽器   acl   .class   class   冒號   

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啟動 所以:
[[email protected] ~]$ 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程式設計語言裡,一種用於實現遠端程序呼叫的API。它使客戶機上啟動並執行程式可以調用遠程伺服器上的對象。遠程方法調用特性使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啟動參數詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.