Java應用啟動引數例項解析
阿新 • • 發佈:2020-10-07
當我們自己跑一個小程式時,可以用類似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 Pool
和 UseStringDeduplication
-> 當然是不重複的。
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。
- Why String Deduplication when we have String Pool https://stackoverflow.com/questions/42911701/why-string-deduplication-when-we-have-string-pool
- Java中String物件兩種賦值方式的區別 https://www.cnblogs.com/developer_chan/archive/2004/01/13/8608410.html
- 開啟String去重XX:+UseStringDeduplication的利與弊 https://blog.csdn.net/goldenfish1919/article/details/94555589
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:設定持久代大小
連結
- JVM引數MetaspaceSize https://www.jianshu.com/p/b448c21d2e71
- JVM調優總結 https://yq.aliyun.com/articles/268842