該參數主要是控制新生代需要經歷多少次GC晉升到老年代中的最大閾值。在JVM中用4個bit存儲(放在對象頭中),所以其最大值是15。如果該值=0則表示對象在Eden區gc後不經過Survivor區直接進入老年代。如果該值等於15,並非意味著,對象必須要經歷15次YGC才會晉升到老年代中。例如,當sur... ...
JVM整個堆大小=年輕代大小 + 年老代大小 + 持久代大小,在JDK1.8及之後的版本由於永久代被元空間替代,所以jdk1.8中的堆=年輕代大小 + 年老代大小。本文使用的是JDK1.8
1、堆大小設置(XX類型參數)
- 初始化堆記憶體:-XX:InitialHeapSize=1024m(-Xms1024m -簡寫)
- 最大堆記憶體:-XX:MaxHeapSize=1024m (-Xmx1024m -簡寫)
例如:-Xms1024m -Xmx1024m -XX:+PrintGCDetails
2、-Xss:線程的堆棧大小:-Xss 預設是 512k~1024k 等價於 -XX:ThreadStackSize=512k 。該值等於零表示使用的是預設值。一般情況下無需設置
例如:-Xms1024m -Xmx1024m -Xss512m -XX:+PrintGCDetails
3、-Xmn:設置年輕代大小。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代後,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。
是 -XX:NewSize 和 -XX:MaxNewSize 參數的簡寫新式
例如:-Xms1024m -Xmx1024m -Xss512m -XX:+PrintGCDetails 我們不設置他的大小,看看預設值是否符合官方比例
結論:MaxNewSize*8/3=1024 符合
例如:-Xms1024m -Xmx1024m -Xmn512m -Xss512m -XX:+PrintGCDetails 設置年輕代大小
老年代被相應的減少
4、元空間-XX:MetaspaceSize :初始化的Metaspace大小,控制元空間發生GC的閾值。GC後,動態增加或降低MetaspaceSize。在預設情況下,這個值大小根據不同的平臺在12M到20M浮動。
-XX:MaxMetaspaceSize:限制Metaspace增長的上限,防止因為某些情況導致Metaspace無限的使用本地記憶體,影響到其他程式。在本機上該參數的預設值為4294967295B(大約4096MB)
5、-XX:NewRatio
新生代(Eden + 2*S)與老年代(不包括永久區)的比值 例如-XX:NewRatio=4 表示新生代:老年代 = 1:4 即老年代占整個對的4/5;預設值=2
例如:-Xms20m -Xmx20m -XX:+PrintGCDetails -XX:NewRatio=4
6、-XX:SurvivorRatio:2個Survivor區和Eden區的比值 例如:-XX:SurvivorRatio=8 表示 兩個Survivor區:Eden區=2:8 ,每個Survivor占 1/10 ;JVM預設=8
例如:-Xms20m -Xmx20m -XX:+PrintGCDetails -XX:NewRatio=4 -XX:SurvivorRatio=8
7、 -XX:MaxTenuringThreshold=3
該參數主要是控制新生代需要經歷多少次GC晉升到老年代中的最大閾值。在JVM中用4個bit存儲(放在對象頭中),所以其最大值是15。如果該值=0則表示對象在Eden區gc後不經過Survivor區直接進入老年代。如果該值等於15,並非意味著,對象必須要經歷15次YGC才會晉升到老年代中。例如,當survivor區空間不夠時,便會提前進入到老年代中,但這個次數一定不大於設置的最大閾值。通過控制對象進入老年代的頻率,可以控制老年代記憶體的大小,以此控制老年代的gc次數
查看預設值:
F:\workspace\IDEA\study\jalja-base-utils>jinfo -flag MaxTenuringThreshold 46644 -XX:MaxTenuringThreshold=15