JVM 記憶體區域大小參數設置
- 2019 年 10 月 7 日
- 筆記
JVM記憶體包括區域
Heap(堆區) New Generation(新生代) Eden 伊甸園 Survivor From Survivor To Old Generation(老年代) 方法區 Permanent Generation(持久代) Stack(棧區) Metaspace(元空間) Direct ByteBuffer(堆外記憶體) 通過JVM啟動參數來配置以上記憶體空間 Heap(堆)記憶體大小設置 -Xms512m 設置JVM堆初始記憶體為512M -Xmx1g 設置JVM堆最大可用記憶體為1G New Generation(新生代)記憶體大小設置 -Xmn256m 設置JVM的新生代記憶體大小(-Xmn 是將NewSize與MaxNewSize設為一致。256m),同下面兩個參數 -XX:NewSize=256m -XX:MaxNewSize=256m
通過新生代和老年代記憶體的比值來設置新生代大小 -XX:NewRatio=3 設置新生代(包括Eden和兩個Survivor區)與老年代的比值。設置為3,則新生代與老年代所佔比值為1:3,新生代占整個堆棧的1/4
Survivor記憶體大小設置 -XX:SurvivorRatio=8 設置為8,則兩個Survivor區與一個Eden區的比值為2:8,一個Survivor區占整個新生代的1/10
Eden記憶體大小設置 新生代減去2*Survivor的記憶體大小就是Eden的大小
Old Generation(老年的)的記憶體大小設置 堆記憶體減去新生代記憶體 如上面設置的參數舉例如下: 老年代初始記憶體為:512M-256M=256M 老年代最大記憶體為:1G-256M=768M
Stack(棧)記憶體大小設置 -Xss1m 每個執行緒都會產生一個棧。在相同物理記憶體下,減小這個值能生成更多的執行緒。如果這個值太小會影響方法調用的深度
Permanent Generation(持久代)記憶體大小設置 方法區記憶體分配(JDK8以前的版本使用,JDK8以後沒有持久代了,使用的MetaSpace) -XX: PermSize=128m 設置持久代初始記憶體大小128M -XX:MaxPermSize=512m 設置持久代最大記憶體大小512M
Direct ByteBuffer(直接記憶體)記憶體大小設置 -XX:MaxDirectMemorySize 當Direct ByteBuffer分配的堆外記憶體到達指定大小後,即觸發Full GC。該值是有上限的,默認是64M,最大為sun.misc.VM.maxDirectMemory()。 在程式中可以獲得-XX:MaxDirectMemorySize的設置的值
設置新生代代對象進入老年代的年齡 -XX:MaxTenuringThreshold=15
設置垃圾最大年齡。如果設置為0的話,則新生代對象不經過Survivor區,直接進入老年代。
對於老年代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則新生代對象會在Survivor區進行多次複製,這樣可以增加對象在新生代的存活時間,增加在新生代即被回收的概論 最大值為15歲,因為對象頭中用了4位進行存儲垃圾年齡 【1111(二進位)=15(十進位)】
不常用的參數 -XX:MaxHeapFreeRatio=70 GC後java堆中空閑量占的最大比例,大於該值,則堆記憶體會減少
-XX:MinHeapFreeRatio=40 GC後java堆中空閑量占的最小比例,小於該值,則堆記憶體會增加
-XX:PretenureSizeThreshold=1024 (單位位元組)對象大小大於1024位元組的直接在老年代分配對象
-XX:TLABWasteTargetPercent =1 TLAB佔eden區的百分比 默認1%
