java啓動參數詳解

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

• 標準參數中比較有用的:
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等等;編程

首先來介紹行爲參數:ruby

參數及其默認值 描述
-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 能夠壓縮指針,起到節約內存佔用的新參數oracle

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

調試參數列表:

參數及其默認值 描述
-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 propertyOracle中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 socketwill be an IPv6 socket. This allows Java(tm) applications to connect too, andaccept connections from, both IPv4 and IPv6 hosts.If an application has a preference to only use IPv4 sockets then thisproperty can be set to true. The implication is that the application will not beable to communicate with IPv6 hosts.-Djboss.platform.mbeanserver 讓JBoss EAP 使用jdk的mbean serverMBean一般是一個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)

相關文章
相關標籤/搜索