JVM記憶體區域引數配置
轉自:https://www.jianshu.com/p/5946c0a414b5
需要提前瞭解的知識點:
下圖是JVM記憶體區域劃分的邏輯圖
JVM記憶體區域邏輯圖從圖中我們大概瞭解JVM相關的記憶體區域。
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
Metaspace(元空間)記憶體大小設定
元空間(Metaspace)(JDK8)
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m(JDK8),JDK8的持久代幾乎可用完機器的所有記憶體,同樣設一個128M的初始值,512M的最大值保護一下。
- 預設情況下,類元資料分配受到可用的本機記憶體容量的限制(容量依然取決於你使用32位JVM還是64位作業系統的虛擬記憶體的可用性)。
- 一個新的引數 (MaxMetaspaceSize)可以使用。允許你來限制用於類元資料的本地記憶體。如果沒有特別指定,元空間將會根據應用程式在執行時的需求動態設定大小。
Direct ByteBuffer(直接記憶體)記憶體大小設定
-XX:MaxDirectMemorySize
此引數的含義是當Direct ByteBuffer分配的堆外記憶體到達指定大小後,即觸發Full GC。注意該值是有上限的,預設是64M,最大為sun.misc.VM.maxDirectMemory(),在程式中中可以獲得-XX:MaxDirectMemorySize的設定的值。
使用NIO可以api可以使用直接記憶體。
設定新生代代物件進入老年代的年齡
-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%