1. 程式人生 > >JVM內存區域參數配置

JVM內存區域參數配置

含義 區域 ces uri 數據 空閑 字節 方法區 ner

轉自: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%

JVM內存區域參數配置