



下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、JVM內(nèi)存模型以及垃圾回收2008-06-03 11:08JAVA堆的描述如下:內(nèi)存由 Perm 和 Heap 組成. 其中Heap = Old + NEW = Eden , from, to JVM內(nèi)存模型中分兩大塊,一塊是 NEW Generation, 另一塊是Old Generation. 在New Generation中,有一個(gè)叫Eden的空間,主要是用來(lái)存放新生的對(duì)象,還有兩個(gè)Survivor Spaces(from,to), 它們用來(lái)存放每次垃圾回收后存活下來(lái)的對(duì)象。在Old Generation中,主要存放應(yīng)用程序中生命周期長(zhǎng)的內(nèi)存對(duì)象,還有個(gè)Permanent Generat
2、ion,主要用來(lái)放JVM自己的反射對(duì)象,比如類(lèi)對(duì)象和方法對(duì)象等。垃圾回收描述:在New Generation塊中,垃圾回收一般用Copying的算法,速度快。每次GC的時(shí)候,存活下來(lái)的對(duì)象首先由Eden拷貝到某個(gè)Survivor Space, 當(dāng)Survivor Space空間滿了后, 剩下的live對(duì)象就被直接拷貝到Old Generation中去。因此,每次GC后,Eden內(nèi)存塊會(huì)被清空。在Old Generation塊中,垃圾回收一般用mark-compact的算法,速度慢些,但減少內(nèi)存要求.垃圾回收分多級(jí),0級(jí)為全部(Full的垃圾回收,會(huì)回收OLD段中的垃圾;1級(jí)或以上為部分垃圾回收
3、,只會(huì)回收NEW中的垃圾,內(nèi)存溢出通常發(fā)生于OLD段或Perm段垃圾回收后,仍然無(wú)內(nèi)存空間容納新的Java對(duì)象的情況。當(dāng)一個(gè)URL被訪問(wèn)時(shí),內(nèi)存申請(qǐng)過(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ū)D. Survivor區(qū)被用來(lái)作為Eden及OLD的中間交換區(qū)域,當(dāng)OLD區(qū)空間足夠時(shí),Survivor區(qū)的對(duì)象會(huì)被移到Old區(qū),否則會(huì)被保留在S
4、urvivor區(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ò)誤”JVM調(diào)優(yōu)建議:ms/mx:定義YOUNG+OLD段的總尺寸,ms為JVM啟動(dòng)時(shí)YOUNG+OLD的內(nèi)存大?。籱x為最大可占用的YOUNG+OLD內(nèi)存大小。在用戶生產(chǎn)環(huán)境上一般將這兩個(gè)值設(shè)為相同,以減少運(yùn)行期間系統(tǒng)在內(nèi)存申請(qǐng)上所花的開(kāi)銷(xiāo)。NewSize/MaxNewSize:定義YOUNG段的尺寸,NewSize為JVM啟動(dòng)時(shí)YO
5、UNG的內(nèi)存大??;MaxNewSize為最大可占用的YOUNG內(nèi)存大小。在用戶生產(chǎn)環(huán)境上一般將這兩個(gè)值設(shè)為相同,以減少運(yùn)行期間系統(tǒng)在內(nèi)存申請(qǐng)上所花的開(kāi)銷(xiāo)。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)銷(xiāo)。SurvivorRatio:設(shè)置Survivor空間和Eden空間的比例內(nèi)存溢出的可能性1. OLD段溢出這種內(nèi)存溢出是最常見(jiàn)的情況之一,產(chǎn)生的原因可能是:1 設(shè)置的內(nèi)存參數(shù)過(guò)小(ms/mx, N
6、ewSize/MaxNewSize2 程序問(wèn)題單個(gè)程序持續(xù)進(jìn)行消耗內(nèi)存的處理,如循環(huán)幾千次的字符串處理,對(duì)字符串處理應(yīng)建議使用StringBuffer。此時(shí)不會(huì)報(bào)內(nèi)存溢出錯(cuò),卻會(huì)使系統(tǒng)持續(xù)垃圾收集,無(wú)法處理其它請(qǐng)求,相關(guān)問(wèn)題程序可通過(guò)Thread Dump獲?。ㄒ?jiàn)系統(tǒng)問(wèn)題診斷一章)單個(gè)程序所申請(qǐng)內(nèi)存過(guò)大,有的程序會(huì)申請(qǐng)幾十乃至幾百兆內(nèi)存,此時(shí)JVM也會(huì)因無(wú)法申請(qǐng)到資源而出現(xiàn)內(nèi)存溢出,對(duì)此首先要找到相關(guān)功能,然后交予程序員修改,要找到相關(guān)程序,必須在Apache日志中尋找。當(dāng)Java對(duì)象使用完畢后,其所引用的對(duì)象卻沒(méi)有銷(xiāo)毀,使得JVM認(rèn)為他還是活躍的對(duì)象而不進(jìn)行回收,這樣累計(jì)占用了大量?jī)?nèi)存而無(wú)法
7、釋放。由于目前市面上還沒(méi)有對(duì)系統(tǒng)影響小的內(nèi)存分析工具,故此時(shí)只能和程序員一起定位。2. Perm段溢出通常由于Perm段裝載了大量的Servlet類(lèi)而導(dǎo)致溢出,目前的解決辦法:1 將PermSize擴(kuò)大,一般256M能夠滿足要求2 若別無(wú)選擇,則只能將servlet的路徑加到CLASSPATH中,但一般不建議這么處理3. C Heap溢出系統(tǒng)對(duì)C Heap沒(méi)有限制,故C Heap發(fā)生問(wèn)題時(shí),Java進(jìn)程所占內(nèi)存會(huì)持續(xù)增長(zhǎng),直到占用所有可用系統(tǒng)內(nèi)存其他:JVM有2個(gè)GC線程。第一個(gè)線程負(fù)責(zé)回收Heap的Young區(qū)。第二個(gè)線程在Heap不足時(shí),遍歷Heap,將Young 區(qū)升級(jí)為Older區(qū)。O
8、lder區(qū)的大小等于-Xmx減去-Xmn,不能將-Xms的值設(shè)的過(guò)大,因?yàn)榈诙€(gè)線程被迫運(yùn)行會(huì)降低JVM的性能。為什么一些程序頻繁發(fā)生GC?有如下原因:l 程序內(nèi)調(diào)用了System.gc(或Runtime.gc(。l 一些中間件軟件調(diào)用自己的GC方法,此時(shí)需要設(shè)置參數(shù)禁止這些GC。l Java的Heap太小,一
9、般默認(rèn)的Heap值都很小。l 頻繁實(shí)例化對(duì)象,Release對(duì)象。此時(shí)盡量保存并重用對(duì)象,例如使用StringBuffer(和String(。如果你發(fā)現(xiàn)每次GC后,Heap的剩余空間會(huì)是總空間的50%,這表示你的Heap處于健康狀態(tài)。許多Server端的Java程序每次GC后最好能有65%的剩余空間。經(jīng)驗(yàn)之談:1Server端JVM最好將-Xms和-Xmx設(shè)為相同值。為了優(yōu)化GC,最好讓-Xmn值約等于-Xmx的1/32。2一個(gè)GUI程序最好是每10到20秒間運(yùn)行一次GC,每次在半秒之內(nèi)完成2。注意
10、:1增加Heap的大小雖然會(huì)降低GC的頻率,但也增加了每次GC的時(shí)間。并且GC運(yùn)行時(shí),所有的用戶線程將暫停,也就是GC期間,Java應(yīng)用程序不做任何工作。2Heap大小并不決定進(jìn)程的內(nèi)存使用量。進(jìn)程的內(nèi)存使用量要大于-Xmx定義的值,因?yàn)镴ava為其他任務(wù)分配內(nèi)存,例如每個(gè)線程的Stack等。2Stack的設(shè)定每個(gè)線程都有他自己的Stack。-Xss每個(gè)線程的Stack大小Stack的大小限制著線程的數(shù)量。如果Stack過(guò)大就好導(dǎo)致內(nèi)存溢漏。-Xss參數(shù)決定Stack大小,例如-Xss1024K。如果Stack太小,也會(huì)導(dǎo)致Stack溢漏。3硬件環(huán)境硬件環(huán)境也影響GC的效率,例如機(jī)器的種類(lèi),內(nèi)存,swap空間,和CPU的數(shù)量。如果你的程序需要頻繁創(chuàng)建很多transient對(duì)象,會(huì)導(dǎo)致JVM頻繁GC。這種情況你可以增加機(jī)器的內(nèi)存,來(lái)減少Swap空間的使用2。44種GC第一種為單線程GC,也是默認(rèn)的GC。,該GC適用于單CPU機(jī)器。第二種為T(mén)hroughput GC,是多線程的GC,適用于多CPU,使用大量線程的程序。第二種GC與第一種GC相似,不同在于GC在收集Young區(qū)是多線程的,但在Old區(qū)和第一種一樣,仍然采用單線程。-XX:+UseParallelGC參數(shù)啟動(dòng)該GC。第三種為Concurrent Low Pause GC,類(lèi)似于第一種,適用于多
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)藥店合作合同范本
- 丹麥工作合同范本
- 辦理消防驗(yàn)收合同范本
- 個(gè)人工資合同范本
- 入股公司項(xiàng)目合同范本
- 2024年云浮聯(lián)通招聘考試真題
- 東莞代理記賬合同范本
- 2025東風(fēng)公司全球校園招聘筆試參考題庫(kù)附帶答案詳解
- 買(mǎi)賣(mài)車(chē)訂金合同范本
- 2024年河南濮陽(yáng)工學(xué)院籌建處 引進(jìn)考試真題
- 退役軍人優(yōu)待證申領(lǐng)表
- Q∕SY 19001-2017 風(fēng)險(xiǎn)分類(lèi)分級(jí)規(guī)范
- 勞務(wù)分包項(xiàng)目經(jīng)理崗位職責(zé)
- 幼兒繪本故事:奇怪的雨傘店
- 鋼琴基礎(chǔ)教程教案
- 糖基轉(zhuǎn)移酶和糖苷酶課件(PPT 111頁(yè))
- 屋面網(wǎng)架結(jié)構(gòu)液壓提升施工方案(50頁(yè))
- (語(yǔ)文A版)四年級(jí)語(yǔ)文下冊(cè)課件跳水 (2)
- 第6章向量空間ppt課件
- 醫(yī)療機(jī)構(gòu)聘用(返聘)證明
- 【單元設(shè)計(jì)】第七章《萬(wàn)有引力與宇宙航行》單元教學(xué)設(shè)計(jì)及教材分析課件高一物理人教版(2019)必修第二冊(cè)
評(píng)論
0/150
提交評(píng)論