JVM 内存区域大小参数设置
需要提前了解的知識(shí)點(diǎn):
1. JVM內(nèi)存模型
2. JVM垃圾回收算法
下圖是JVM內(nèi)存區(qū)域劃分的邏輯圖
從圖中我們大概了解JVM相關(guān)的內(nèi)存區(qū)域。
JVM內(nèi)存包括區(qū)域
Heap(堆區(qū))
- New Generation(新生代)
- Eden
- Survivor From
- Survivor To
- Old Generation(老年代)
方法區(qū)
- Permanent Generation(持久代)
下面我們就通過(guò)一些JVM啟動(dòng)參數(shù)來(lái)配置以上內(nèi)存空間
Heap(堆)內(nèi)存大小設(shè)置
-Xms512m
設(shè)置JVM堆初始內(nèi)存為512M
-Xmx1g
設(shè)置JVM堆最大可用內(nèi)存為1G
New Generation(新生代)內(nèi)存大小設(shè)置
-Xmn256m
設(shè)置JVM的新生代內(nèi)存大小(-Xmn 是將NewSize與MaxNewSize設(shè)為一致。256m),同下面兩個(gè)參數(shù)
-XX:NewSize=256m
-XX:MaxNewSize=256m
還可以通過(guò)新生代和老年代內(nèi)存的比值來(lái)設(shè)置新生代大小
-XX:NewRatio=3
設(shè)置新生代(包括Eden和兩個(gè)Survivor區(qū))與老年代的比值(除去持久代)。設(shè)置為3,則新生代與老年代所占比值為1:3,新生代占整個(gè)堆棧的1/4
Survivor內(nèi)存大小設(shè)置
-XX:SurvivorRatio=8
設(shè)置為8,則兩個(gè)Survivor區(qū)與一個(gè)Eden區(qū)的比值為2:8,一個(gè)Survivor區(qū)占整個(gè)新生代的1/10
Eden內(nèi)存大小設(shè)置
新生代減去2*Survivor的內(nèi)存大小就是Eden的大小。
Old Generation(老年的)的內(nèi)存大小設(shè)置
堆內(nèi)存減去新生代內(nèi)存
如上面設(shè)置的參數(shù)舉例如下:
老年代初始內(nèi)存為:512M-256M=256M
老年代最大內(nèi)存為:1G-256M=768M
Stack(棧)內(nèi)存大小設(shè)置
-Xss1m
每個(gè)線程都會(huì)產(chǎn)生一個(gè)棧。在相同物理內(nèi)存下,減小這個(gè)值能生成更多的線程。如果這個(gè)值太小會(huì)影響方法調(diào)用的深度。
Permanent Generation(持久代)內(nèi)存大小設(shè)置
方法區(qū)內(nèi)存分配(JDK8以前的版本使用,JDK8以后沒有持久代了,使用的MetaSpace)
-XX: PermSize=128m 設(shè)置持久代初始內(nèi)存大小128M
-XX:MaxPermSize=512m 設(shè)置持久代最大內(nèi)存大小512M
Metaspace(元空間)內(nèi)存大小設(shè)置
元空間(Metaspace)(JDK8)
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m(JDK8),JDK8的持久代幾乎可用完機(jī)器的所有內(nèi)存,同樣設(shè)一個(gè)128M的初始值,512M的最大值保護(hù)一下。
Direct ByteBuffer(直接內(nèi)存)內(nèi)存大小設(shè)置
-XX:MaxDirectMemorySize
此參數(shù)的含義是當(dāng)Direct ByteBuffer分配的堆外內(nèi)存到達(dá)指定大小后,即觸發(fā)Full GC。注意該值是有上限的,默認(rèn)是64M,最大為sun.misc.VM.maxDirectMemory(),在程序中中可以獲得-XX:MaxDirectMemorySize的設(shè)置的值。
使用NIO可以api可以使用直接內(nèi)存。
設(shè)置新生代代對(duì)象進(jìn)入老年代的年齡
-XX:MaxTenuringThreshold=15
設(shè)置垃圾最大年齡。如果設(shè)置為0的話,則新生代對(duì)象不經(jīng)過(guò)Survivor區(qū),直接進(jìn)入老年代。對(duì)于老年代比較多的應(yīng)用,可以提高效率。如果將此值設(shè)置為一個(gè)較大值,則新生代對(duì)象會(huì)在Survivor區(qū)進(jìn)行多次復(fù)制,這樣可以增加對(duì)象再新生代的存活時(shí)間,增加在新生代即被回收的概論。
他最大值為15歲,因?yàn)閷?duì)象頭中用了4位進(jìn)行存儲(chǔ)垃圾年齡 【1111(二進(jìn)制)=15(十進(jìn)制)】。
不常用的參數(shù):
-XX:MaxHeapFreeRatio=70
GC后java堆中空閑量占的最大比例,大于該值,則堆內(nèi)存會(huì)減少
-XX:MinHeapFreeRatio=40
GC后java堆中空閑量占的最小比例,小于該值,則堆內(nèi)存會(huì)增加
-XX:PretenureSizeThreshold=1024
(單位字節(jié))對(duì)象大小大于1024字節(jié)的直接在老年代分配對(duì)象
-XX:TLABWasteTargetPercent =1
TLAB占eden區(qū)的百分比 默認(rèn)1%
本人簡(jiǎn)書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點(diǎn)擊這里快速進(jìn)入簡(jiǎn)書
GIT地址:http://git.oschina.net/brucekankan/
點(diǎn)擊這里快速進(jìn)入GIT
總結(jié)
以上是生活随笔為你收集整理的JVM 内存区域大小参数设置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JVM 类加载机制深入浅出
- 下一篇: JVM(HotSpot) 垃圾收集器