1. 程式人生 > >JVM記憶體區域引數配置

JVM記憶體區域引數配置

轉自:https://www.jianshu.com/p/5946c0a414b5

需要提前瞭解的知識點:

  1. JVM記憶體模型
  2. JVM垃圾回收演算法

下圖是JVM記憶體區域劃分的邏輯圖

  JVM記憶體區域邏輯圖

從圖中我們大概瞭解JVM相關的記憶體區域。

JVM記憶體包括區域

  1. Heap(堆區)
  • New Generation(新生代)
    • Eden
    • Survivor From
    • Survivor To
  • Old Generation(老年代)
  1. 方法區
  • Permanent Generation(持久代)
  1. Stack(棧區)
  2. Metaspace(元空間)
  3. 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的最大值保護一下。

  1. 預設情況下,類元資料分配受到可用的本機記憶體容量的限制(容量依然取決於你使用32位JVM還是64位作業系統的虛擬記憶體的可用性)。
  1. 一個新的引數 (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%