JVM內存包括區域java
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=256mspa
經過新生代和老年代內存的比值來設置新生代大小
-XX:NewRatio=3
設置新生代(包括Eden和兩個Survivor區)與老年代的比值。設置爲3,則新生代與老年代所佔比值爲1:3,新生代佔整個堆棧的1/4線程
Survivor內存大小設置
-XX:SurvivorRatio=8
設置爲8,則兩個Survivor區與一個Eden區的比值爲2:8,一個Survivor區佔整個新生代的1/103d
Eden內存大小設置
新生代減去2*Survivor的內存大小就是Eden的大小對象
Old Generation(老年的)的內存大小設置
堆內存減去新生代內存
如上面設置的參數舉例以下:
老年代初始內存爲:512M-256M=256M
老年代最大內存爲:1G-256M=768Mblog
Stack(棧)內存大小設置
-Xss1m
每一個線程都會產生一個棧。在相同物理內存下,減少這個值能生成更多的線程。若是這個值過小會影響方法調用的深度內存
Permanent Generation(持久代)內存大小設置
方法區內存分配(JDK8之前的版本使用,JDK8之後沒有持久代了,使用的MetaSpace)
-XX: PermSize=128m 設置持久代初始內存大小128M
-XX:MaxPermSize=512m 設置持久代最大內存大小512Mget
Direct ByteBuffer(直接內存)內存大小設置
-XX:MaxDirectMemorySize
當Direct ByteBuffer分配的堆外內存到達指定大小後,即觸發Full GC。該值是有上限的,默認是64M,最大爲sun.misc.VM.maxDirectMemory()。
在程序中能夠得到-XX:MaxDirectMemorySize的設置的值io
設置新生代代對象進入老年代的年齡
-XX:MaxTenuringThreshold=15ast
設置垃圾最大年齡。若是設置爲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%