



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
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中,有一個叫Eden的空間,主要是用來存放新生的對象,還有兩個Survivor Spaces(from,to), 它們用來存放每次垃圾回收后存活下來的對象。在Old Generation中,主要存放應用程序中生命周期長的內(nèi)存對象,還有個Permanent Generat
2、ion,主要用來放JVM自己的反射對象,比如類對象和方法對象等。垃圾回收描述:在New Generation塊中,垃圾回收一般用Copying的算法,速度快。每次GC的時候,存活下來的對象首先由Eden拷貝到某個Survivor Space, 當Survivor Space空間滿了后, 剩下的live對象就被直接拷貝到Old Generation中去。因此,每次GC后,Eden內(nèi)存塊會被清空。在Old Generation塊中,垃圾回收一般用mark-compact的算法,速度慢些,但減少內(nèi)存要求.垃圾回收分多級,0級為全部(Full的垃圾回收,會回收OLD段中的垃圾;1級或以上為部分垃圾回收
3、,只會回收NEW中的垃圾,內(nèi)存溢出通常發(fā)生于OLD段或Perm段垃圾回收后,仍然無內(nèi)存空間容納新的Java對象的情況。當一個URL被訪問時,內(nèi)存申請過程如下:A. JVM會試圖為相關(guān)Java對象在Eden中初始化一塊內(nèi)存區(qū)域B. 當Eden空間足夠時,內(nèi)存申請結(jié)束。否則到下一步C. JVM試圖釋放在Eden中所有不活躍的對象(這屬于1或更高級的垃圾回收), 釋放后若Eden空間仍然不足以放入新對象,則試圖將部分Eden中活躍對象放入Survivor區(qū)D. Survivor區(qū)被用來作為Eden及OLD的中間交換區(qū)域,當OLD區(qū)空間足夠時,Survivor區(qū)的對象會被移到Old區(qū),否則會被保留在S
4、urvivor區(qū)E. 當OLD區(qū)空間不夠時,JVM會在OLD區(qū)進行完全的垃圾收集(0級)F. 完全垃圾收集后,若Survivor及OLD區(qū)仍然無法存放從Eden復制過來的部分對象,導致JVM無法在Eden區(qū)為新對象創(chuàng)建內(nèi)存區(qū)域,則出現(xiàn)”out of memory錯誤”JVM調(diào)優(yōu)建議:ms/mx:定義YOUNG+OLD段的總尺寸,ms為JVM啟動時YOUNG+OLD的內(nèi)存大??;mx為最大可占用的YOUNG+OLD內(nèi)存大小。在用戶生產(chǎn)環(huán)境上一般將這兩個值設為相同,以減少運行期間系統(tǒng)在內(nèi)存申請上所花的開銷。NewSize/MaxNewSize:定義YOUNG段的尺寸,NewSize為JVM啟動時YO
5、UNG的內(nèi)存大??;MaxNewSize為最大可占用的YOUNG內(nèi)存大小。在用戶生產(chǎn)環(huán)境上一般將這兩個值設為相同,以減少運行期間系統(tǒng)在內(nèi)存申請上所花的開銷。PermSize/MaxPermSize:定義Perm段的尺寸,PermSize為JVM啟動時Perm的內(nèi)存大??;MaxPermSize為最大可占用的Perm內(nèi)存大小。在用戶生產(chǎn)環(huán)境上一般將這兩個值設為相同,以減少運行期間系統(tǒng)在內(nèi)存申請上所花的開銷。SurvivorRatio:設置Survivor空間和Eden空間的比例內(nèi)存溢出的可能性1. OLD段溢出這種內(nèi)存溢出是最常見的情況之一,產(chǎn)生的原因可能是:1 設置的內(nèi)存參數(shù)過小(ms/mx, N
6、ewSize/MaxNewSize2 程序問題單個程序持續(xù)進行消耗內(nèi)存的處理,如循環(huán)幾千次的字符串處理,對字符串處理應建議使用StringBuffer。此時不會報內(nèi)存溢出錯,卻會使系統(tǒng)持續(xù)垃圾收集,無法處理其它請求,相關(guān)問題程序可通過Thread Dump獲?。ㄒ娤到y(tǒng)問題診斷一章)單個程序所申請內(nèi)存過大,有的程序會申請幾十乃至幾百兆內(nèi)存,此時JVM也會因無法申請到資源而出現(xiàn)內(nèi)存溢出,對此首先要找到相關(guān)功能,然后交予程序員修改,要找到相關(guān)程序,必須在Apache日志中尋找。當Java對象使用完畢后,其所引用的對象卻沒有銷毀,使得JVM認為他還是活躍的對象而不進行回收,這樣累計占用了大量內(nèi)存而無法
7、釋放。由于目前市面上還沒有對系統(tǒng)影響小的內(nèi)存分析工具,故此時只能和程序員一起定位。2. Perm段溢出通常由于Perm段裝載了大量的Servlet類而導致溢出,目前的解決辦法:1 將PermSize擴大,一般256M能夠滿足要求2 若別無選擇,則只能將servlet的路徑加到CLASSPATH中,但一般不建議這么處理3. C Heap溢出系統(tǒng)對C Heap沒有限制,故C Heap發(fā)生問題時,Java進程所占內(nèi)存會持續(xù)增長,直到占用所有可用系統(tǒng)內(nèi)存其他:JVM有2個GC線程。第一個線程負責回收Heap的Young區(qū)。第二個線程在Heap不足時,遍歷Heap,將Young 區(qū)升級為Older區(qū)。O
8、lder區(qū)的大小等于-Xmx減去-Xmn,不能將-Xms的值設的過大,因為第二個線程被迫運行會降低JVM的性能。為什么一些程序頻繁發(fā)生GC?有如下原因:l 程序內(nèi)調(diào)用了System.gc(或Runtime.gc(。l 一些中間件軟件調(diào)用自己的GC方法,此時需要設置參數(shù)禁止這些GC。l Java的Heap太小,一
9、般默認的Heap值都很小。l 頻繁實例化對象,Release對象。此時盡量保存并重用對象,例如使用StringBuffer(和String(。如果你發(fā)現(xiàn)每次GC后,Heap的剩余空間會是總空間的50%,這表示你的Heap處于健康狀態(tài)。許多Server端的Java程序每次GC后最好能有65%的剩余空間。經(jīng)驗之談:1Server端JVM最好將-Xms和-Xmx設為相同值。為了優(yōu)化GC,最好讓-Xmn值約等于-Xmx的1/32。2一個GUI程序最好是每10到20秒間運行一次GC,每次在半秒之內(nèi)完成2。注意
10、:1增加Heap的大小雖然會降低GC的頻率,但也增加了每次GC的時間。并且GC運行時,所有的用戶線程將暫停,也就是GC期間,Java應用程序不做任何工作。2Heap大小并不決定進程的內(nèi)存使用量。進程的內(nèi)存使用量要大于-Xmx定義的值,因為Java為其他任務分配內(nèi)存,例如每個線程的Stack等。2Stack的設定每個線程都有他自己的Stack。-Xss每個線程的Stack大小Stack的大小限制著線程的數(shù)量。如果Stack過大就好導致內(nèi)存溢漏。-Xss參數(shù)決定Stack大小,例如-Xss1024K。如果Stack太小,也會導致Stack溢漏。3硬件環(huán)境硬件環(huán)境也影響GC的效率,例如機器的種類,內(nèi)存,swap空間,和CPU的數(shù)量。如果你的程序需要頻繁創(chuàng)建很多transient對象,會導致JVM頻繁GC。這種情況你可以增加機器的內(nèi)存,來減少Swap空間的使用2。44種GC第一種為單線程GC,也是默認的GC。,該GC適用于單CPU機器。第二種為Throughput GC,是多線程的GC,適用于多CPU,使用大量線程的程序。第二種GC與第一種GC相似,不同在于GC在收集Young區(qū)是多線程的,但在Old區(qū)和第一種一樣,仍然采用單線程。-XX:+UseParallelGC參數(shù)啟動該GC。第三種為Concurrent Low Pause GC,類似于第一種,適用于多
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三農(nóng)人才培養(yǎng)方案集
- 哈密文旅集團實習的內(nèi)容
- 農(nóng)業(yè)科技技術(shù)應用與推廣手冊
- 洋酒名酒知識培訓課件
- 康美OTC終端藥店手繪POP培訓教程
- 辦公場所租賃協(xié)議書
- 2025年安徽揚子職業(yè)技術(shù)學院單招職業(yè)技能考試題庫1套
- 酒店管理與接待作業(yè)指導書
- 2025年學前教育管理學課件資源整合探討
- 工程施工施工勞務派遣協(xié)議書
- 2025年鄂東高三語文2月調(diào)研聯(lián)考試卷附答案解析
- 滬教版數(shù)學四年級下冊全冊教案
- 數(shù)字孿生技術(shù) 課件 第1、2章 概述;數(shù)字孿生中的物聯(lián)網(wǎng)和人工智能
- 2024年山東外貿(mào)職業(yè)學院高職單招語文歷年參考題庫含答案解析
- 數(shù)字經(jīng)濟學導論-全套課件
- NB/T 10742-2021智能化綜采工作面設計規(guī)范
- DGJ 08-70-2021 建筑物、構(gòu)筑物拆除技術(shù)標準
- 2022年義務教育語文課程標準(2022版)解讀【新課標背景下的初中名著閱讀教學質(zhì)量提升思考】
- 屋面網(wǎng)架結(jié)構(gòu)液壓提升施工方案(50頁)
- 第6章向量空間ppt課件
- 醫(yī)療機構(gòu)聘用(返聘)證明
評論
0/150
提交評論