jvm的参数含义及设置
最近在研究jvm基本的原理,對(duì)jvm的參數(shù)設(shè)置了解了一下,mark如下:
幾個(gè)基本概念:
PermGen space:全稱是Permanent Generation space,即永久代。就是說(shuō)是永久保存的區(qū)域,用于存放Class和Meta信息,Class在被Load的時(shí)候被放入該區(qū)域,GC(Garbage Collection)應(yīng)該不會(huì)對(duì)PermGen space進(jìn)行清理,所以如果你的APP會(huì)LOAD很多CLASS的話,就很可能出現(xiàn)PermGen space錯(cuò)誤。
Heap space:存放Instance。Java Heap分為3個(gè)區(qū),Young即新生代,Old即老生代和Permanent。Young保存剛實(shí)例化的對(duì)象。當(dāng)該區(qū)被填滿時(shí),GC會(huì)將對(duì)象移到Old區(qū)。Permanent區(qū)則負(fù)責(zé)保存反射對(duì)象。
幾個(gè)參數(shù)設(shè)置的意義:
xms/xmx:定義YOUNG+OLD段的總尺寸,ms為JVM啟動(dòng)時(shí)YOUNG+OLD的內(nèi)存大小;mx為最大可占用的YOUNG+OLD內(nèi)存大小。在用戶生產(chǎn)環(huán)境上一般將這兩個(gè)值設(shè)為相同,以減少運(yùn)行期間系統(tǒng)在內(nèi)存申請(qǐng)上所花的開(kāi)銷。
NewSize/MaxNewSize:定義YOUNG段的尺寸,NewSize為JVM啟動(dòng)時(shí)YOUNG的內(nèi)存大小;MaxNewSize為最大可占用的YOUNG內(nèi)存大小。在用戶生產(chǎn)環(huán)境上一般將這兩個(gè)值設(shè)為相同,以減少運(yùn)行期間系統(tǒng)在內(nèi)存申請(qǐng)上所花的開(kāi)銷。
PermSize/MaxPermSize:定義Perm段的尺寸,PermSize為JVM啟動(dòng)時(shí)Perm的內(nèi)存大小;MaxPermSize為最大可占用的Perm內(nèi)存大小。在用戶生產(chǎn)環(huán)境上一般將這兩個(gè)值設(shè)為相同,以減少運(yùn)行期間系統(tǒng)在內(nèi)存申請(qǐng)上所花的開(kāi)銷。
SurvivorRatio:設(shè)置YOUNG代中Survivor空間和Eden空間的比例
申請(qǐng)一塊內(nèi)存的過(guò)程:
A. JVM會(huì)試圖為相關(guān)Java對(duì)象在Eden中初始化一塊內(nèi)存區(qū)域
B. 當(dāng)Eden空間足夠時(shí),內(nèi)存申請(qǐng)結(jié)束。否則到下一步
C. JVM試圖釋放在Eden中所有不活躍的對(duì)象(這屬于1或更高級(jí)的垃圾回收);釋放后若Eden空間仍然不足以放入新對(duì)象,則試圖將部分Eden中活躍對(duì)象放入Survivor區(qū)/OLD區(qū)
D. Survivor區(qū)被用來(lái)作為Eden及OLD的中間交換區(qū)域,當(dāng)OLD區(qū)空間足夠時(shí),Survivor區(qū)的對(duì)象會(huì)被移到Old區(qū),否則會(huì)被保留在Survivor區(qū)
E. 當(dāng)OLD區(qū)空間不夠時(shí),JVM會(huì)在OLD區(qū)進(jìn)行完全的垃圾收集(0級(jí))
F. 完全垃圾收集后,若Survivor及OLD區(qū)仍然無(wú)法存放從Eden復(fù)制過(guò)來(lái)的部分對(duì)象,導(dǎo)致JVM無(wú)法在Eden區(qū)為新對(duì)象創(chuàng)建內(nèi)存區(qū)域,則出現(xiàn)”out of memory錯(cuò)誤”
我們的一種resin服務(wù)器的jvm參數(shù)設(shè)置:
“-Xmx2000M -Xms2000M -Xmn500M -XX:PermSize=250M -XX:MaxPermSize=250M -Xss256K -XX:+DisableExplicitGC -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log”
?是一種典型的響應(yīng)時(shí)間優(yōu)先型的配置。
Java中有四種不同的回收算法,對(duì)應(yīng)的啟動(dòng)參數(shù)為
–XX:+UseSerialGC
–XX:+UseParallelGC
–XX:+UseParallelOldGC
–XX:+UseConcMarkSweepGC
1. Serial Collector
大部分平臺(tái)或者強(qiáng)制 java -client 默認(rèn)會(huì)使用這種。
young generation算法 = serial
old generation算法 = serial (mark-sweep-compact)
這種方法的缺點(diǎn)很明顯,stop-the-world, 速度慢。服務(wù)器應(yīng)用不推薦使用。
2. Parallel Collector
在linux x64上默認(rèn)是這種,其他平臺(tái)要加 java -server 參數(shù)才會(huì)默認(rèn)選用這種。
young = parallel,多個(gè)thread同時(shí)copy
old = mark-sweep-compact = 1
優(yōu)點(diǎn):新生代回收更快。因?yàn)橄到y(tǒng)大部分時(shí)間做的gc都是新生代的,這樣提高了throughput(cpu用于非gc時(shí)間)
缺點(diǎn):當(dāng)運(yùn)行在8G/16G server上old generation live object太多時(shí)候pause time過(guò)長(zhǎng)
3. Parallel Compact Collector (ParallelOld)
young = parallel = 2
old = parallel,分成多個(gè)獨(dú)立的單元,如果單元中l(wèi)ive object少則回收,多則跳過(guò)
優(yōu)點(diǎn):old old generation上性能較 parallel 方式有提高
缺點(diǎn):大部分server系統(tǒng)old generation內(nèi)存占用會(huì)達(dá)到60%-80%, 沒(méi)有那么多理想的單元live object很少方便迅速回收,同時(shí)compact方面開(kāi)銷比起parallel并沒(méi)明顯減少。
4. Concurent Mark-Sweep(CMS) Collector
young generation = parallel collector = 2
old = cms
同時(shí)不做 compact 操作。
優(yōu)點(diǎn):pause time會(huì)降低, pause敏感但CPU有空閑的場(chǎng)景需要建議使用策略4.
缺點(diǎn):cpu占用過(guò)多,cpu密集型服務(wù)器不適合。另外碎片太多,每個(gè)object的存儲(chǔ)都要通過(guò)鏈表連續(xù)跳n個(gè)地方,空間浪費(fèi)問(wèn)題也會(huì)增大。
?內(nèi)存監(jiān)控的方法:
1.? jmap -heap?pid
??????? 查看java 堆(heap)使用情況
?
??????? using thread-local object allocation.
??????? Parallel GC with 4 thread(s)????????? //GC 方式
???????? Heap Configuration:?????? //堆內(nèi)存初始化配置
???????? MinHeapFreeRatio=40???? //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MinHeapFreeRatio設(shè)置JVM堆最小空閑比率(default 40)
???????? MaxHeapFreeRatio=70? //對(duì)應(yīng)jvm啟動(dòng)參數(shù) -XX:MaxHeapFreeRatio設(shè)置JVM堆最大空閑比率(default 70)
???????? MaxHeapSize=512.0MB? //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxHeapSize=設(shè)置JVM堆的最大大小
???????? NewSize? = 1.0MB????????? //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:NewSize=設(shè)置JVM堆的‘新生代’的默認(rèn)大小
???????? MaxNewSize =4095MB?? //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxNewSize=設(shè)置JVM堆的‘新生代’的最大大小
???????? OldSize? = 4.0MB??????????? //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:OldSize=<value>:設(shè)置JVM堆的‘老生代’的大小
???????? NewRatio? = 8???????? //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
???????? SurvivorRatio = 8??? //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:SurvivorRatio=設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的大小比值
????????? PermSize= 16.0MB?????? //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:PermSize=<value>:設(shè)置JVM堆的‘永生代’的初始大小
????????? MaxPermSize=64.0MB? //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxPermSize=<value>:設(shè)置JVM堆的‘永生代’的最大大小
?
?
????????? Heap Usage:?????????????? //堆內(nèi)存分步
????????? PS Young Generation
????????? Eden Space:????????? //Eden區(qū)內(nèi)存分布
??????????? capacity = 20381696 (19.4375MB)? //Eden區(qū)總?cè)萘?br /> ??????????? used???? = 20370032 (19.426376342773438MB)? //Eden區(qū)已使用
??????????? free???? = 11664 (0.0111236572265625MB)? //Eden區(qū)剩余容量
??????????? 99.94277218147106% used? //Eden區(qū)使用比率
???????? From Space:??????? //其中一個(gè)Survivor區(qū)的內(nèi)存分布
???????????? capacity = 8519680 (8.125MB)
???????????? used???? = 32768 (0.03125MB)
???????????? free???? = 8486912 (8.09375MB)
???????????? 0.38461538461538464% used
??????? To Space:??????????? //另一個(gè)Survivor區(qū)的內(nèi)存分布
??????????? capacity = 9306112 (8.875MB)
??????????? used???? = 0 (0.0MB)
??????????? free???? = 9306112 (8.875MB)
??????????? 0.0% used
??????? PS Old Generation? //當(dāng)前的Old區(qū)內(nèi)存分布
??????????? capacity = 366280704 (349.3125MB)
??????????? used???? = 322179848 (307.25464630126953MB)
??????????? free???? = 44100856 (42.05785369873047MB)
??????????? 87.95982001825573% used
??????? PS Perm Generation? //當(dāng)前的 “永生代” 內(nèi)存分布
??????????? capacity = 32243712 (30.75MB)
??????????? used???? = 28918584 (27.57891082763672MB)
??????????? free???? = 3325128 (3.1710891723632812MB)
??????????? 89.68751488662348% used
總結(jié)
以上是生活随笔為你收集整理的jvm的参数含义及设置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java内存溢出分析
- 下一篇: eclipse中hadoop2.3.0环