­

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%