1. 程式人生 > 實用技巧 >Java應用啟動引數例項解析

Java應用啟動引數例項解析

當我們自己跑一個小程式時,可以用類似java app.jar的命令直接跑。而在實際的生產/開發環境,除了classpath外,還會加上一大堆JVM執行引數。

下面,就對一個例項進行分析:

-Xms140G  // 最小堆
-Xmx140G  // 最大堆
-Xss10M   // 棧空間
-XX:MetaspaceSize=2G  // Metaspace擴容時觸發FullGC的初始化閾值

-XX:MinHeapFreeRatio=10  // serial collector 使用的引數,控制Heap擴大或者收縮,不常用了
-XX:MaxHeapFreeRatio=20 

-XX:+UseStringDeduplication // JVM在做GC的同時會做重複字串消除
-XX:+PrintStringDeduplicationStatistics

-XX:+UseG1GC  // 使用G1 GC
-XX:+UnlockExperimentalVMOptions  // 允許使用experimental的引數
-XX:G1HeapWastePercent=5  // Sets the percentage of heap that you are willing to waste.
-XX:G1MixedGCLiveThresholdPercent=85  // Sets the occupancy threshold for an old region to be included in a mixed garbage collection cycle. (experimental)
-XX:G1HeapRegionSize=32M  // Sets the size of a G1 region.
-XX:MaxGCPauseMillis=10000  // Sets a target value for desired maximum pause time.
-verbose:gc  // alias for -XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc:/path/to/my_gc.log  // GC log檔案存放位置

-Dcom.sun.management.jmxremote.port=1234  // 遠端除錯埠
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

-Dlog4j.configuration=file://$LOG4J_FILE  // log4j檔案存放位置

Xms Xmx Xss

很重要,很重要,很重要。

隨著我們應用的業務量不斷增大,Xms和Xmx也一路增長。從80G->140G。

-Xms140G  // 最小堆
-Xmx140G  // 最大堆
-Xss10M   // 棧空間
# -Xmn50G   // 年輕代

Xss:設定每個執行緒的堆疊大小。JDK5.0以後每個執行緒堆疊大小為1M,以前每個執行緒堆疊大小為256K。

Xmn:一般年輕代設定為整個堆大小的3/8。

注:一般最小堆和最大堆設定一樣,防止記憶體抖動(這個“抖動”的操作也是耗時的)。

UseStringDeduplication

這裡有一個疑問,String PoolUseStringDeduplication

這兩個東西功能重複嗎?

-> 當然是不重複的。

String Pool存的是literal或者呼叫String.intern()的字串。如下:

String a = "Hello";
String b = new String("Hello").intern();
//System.out.println(System.identityHashCode(a) + ", " + Integer.toHexString(a.hashCode()));
//System.out.println(System.identityHashCode(b) + ", " + Integer.toHexString(b.hashCode()));

除此之外,更多的情況,String是 Runtime 生成的。比如,從DB中query出來,或者呼叫某個REST API介面query出來。

String c = new String("Hello");
String d = getFromDB();
String e = getFromAPI();

使用這個引數可以對以上所有情況去重。當然,前提是使用G1 GC。

UseG1GC

特別要說明的一項是MaxGCPauseMillis,預設是200miliseconds,我們這裡調到了10000。

這個引數的背後代表的意思是:每次年輕代垃圾回收的最長時間,如果無法滿足此時間,JVM會自動調整年輕代大小,以滿足此值。
因為我們的應用是吞吐量大,相應要求低,所以這裡可以設大一點的值,否則年輕代過小,可能導致頻繁FGC。

其它的引數基本上都是使用的預設值。

其它以上沒列出來的常用引數

-XX:NewSize=n:設定年輕代大小
-XX:NewRatio=n:設定年輕代和年老代的比值為1:n。如3,表示年輕代與年老代比值為1:3
-XX:SurvivorRatio=n:設定(兩個)Survivor區和Eden區的比值為2:n。如3,表示Survivor:Eden=2:3
-XX:MaxPermSize=n:設定持久代大小

連結