Java8新特性探究(九)跟OOM:Permgen說再見吧-Java開發(fā)Java經驗技巧_第1頁
Java8新特性探究(九)跟OOM:Permgen說再見吧-Java開發(fā)Java經驗技巧_第2頁
Java8新特性探究(九)跟OOM:Permgen說再見吧-Java開發(fā)Java經驗技巧_第3頁
Java8新特性探究(九)跟OOM:Permgen說再見吧-Java開發(fā)Java經驗技巧_第4頁
Java8新特性探究(九)跟OOM:Permgen說再見吧-Java開發(fā)Java經驗技巧_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、java 8新特性探究(九)跟oom: pcrmgcn說再見吧-編程 開發(fā)技術java 8新特性探究(九)跟oom: permgen說再見吧原文出處:成熟的毛毛蟲的博客很多開發(fā)者都在其系統(tǒng)屮見過java. lang. outofmemoryerror: permgen space”這一問題。這往往是由類加載器相關的內存泄漏以及新類加載器的創(chuàng)建 導致的,通常出現(xiàn)于代碼熱部署時。相對于正式產品,該問題在開發(fā)機上出現(xiàn)的 頻率更高,在產品中最常見的“問題”是默認值太低了。常用的解決方法是將其 設置為256mb或更高。permgen space簡單介紹permgen space的全稱是permanent

2、 generation space,是指內存的永久保存區(qū) 域,說說為什么會內存益出:這一部分用于存放class和meta的信息,class在 被load的時候被放入permgen space區(qū)域,它和和存放instance的heap區(qū)域 不同,所以如果你的app會load很多class的話,就很可能出現(xiàn)permgen space 錯誤。這種錯誤常見在web服務器對jsp進行pre compile的時候。jvm 種類有很多,比如 oralce-sun hotspot, oralce jrockit, ibm j9, taobao jvm (淘寶好樣的?。┑鹊?。當然武林盟主是hotspot 了,這

3、個毫無爭議。需要 注意的是,permgen space 是 oracle-sun hotspot 才有,jrockit 以及 j9 是沒 冇這個區(qū)威。元空間(metaspace) 種新的內存空間誕生jdk8 hotspot jvm將移除永久區(qū),使用本地內存來存儲類元數(shù)據(jù)信息并稱之為: 元空間(metaspace);這與oracle jrockit和ibm jvm' s很相似,如卜圖所 示eden »survivor survivorold gen eration for older objects這意味著不會再有java. lang. outofmcmoryerror: pe

4、rmgen問題,也不再需耍你 進行調優(yōu)及監(jiān)控內存空間的使用但請等等,這么說還為時過早。在默認情況 下,這些改變是透明的,接下來我們的展示將使你知道仍然要關注類元數(shù)據(jù)內存 的占用。請一定要牢記,這個新特性也不能神奇地消除類和類加載器導致的內存 泄漏。java8中metaspacc總結如卜:permgen空間的狀況這部分內存空間將全部移除。jvm的參數(shù):permsize和maxpermsize會被忽略并給出警告(如果在啟用時設 置了這兩個參數(shù))。metaspace內存分配模型大部分類元數(shù)據(jù)都在本地內存小分配。用于描述類元數(shù)據(jù)的“klasses”已經被移除。metaspace 容量默認情況下,類元數(shù)

5、據(jù)只受可用的木地內存限制(容量取決于是32位或是64 位操作系統(tǒng)的可用虛擬內存大?。?。新參數(shù)(maxmetaspacesize)用于限制本地內存分配給類元數(shù)據(jù)的大小。如果沒 有指定這個參數(shù),元空間會在運行時根據(jù)需要動態(tài)調整。metaspace垃圾回收對于僵死的類及類加載器的垃圾回收將在元數(shù)據(jù)使用達到umaxmctaspaccsizc參數(shù)的設定值時進行。適時地監(jiān)控和調整元空間對于減小垃圾回收頻率和減少延時是很冇必要的。持續(xù) 的元空間垃圾冋收說明,可能存在類、類加載器導致的內存泄漏或是大小設置不 合適。java堆內存的影響一些朵項數(shù)據(jù)已經移到java堆空間中。升級到jdk8zas,會發(fā)現(xiàn)java堆

6、 空間 冇所增長。metaspace 監(jiān)控元空間的使用情況可以從hotspotl. 8的詳細gc日志輸岀中得到。jstat和jvisualvm兩個工具,在使用b75版本進行測試時,已經更新了,但 是還是能看到老的pcrmgen空間的出現(xiàn)。前而已經從理論上充分說明,下而讓我們通過“泄漏”程序進行新內存空間的觀 察permgen vs. metaspace 運行時比較為了更好地理解metaspace內存空間的運行時行為,將進行以卜幾種場景的測試:1. 使用jdk1.7運行java程序,監(jiān)控并耗盡默認設定的85mb人小的permgen內存空 間。2. 使用jdk1.8運行java程序,監(jiān)控新meta

7、space內存空間的動態(tài)增長和垃圾回收過 程。3. 使用jdk1.8運行java程序,模擬耗盡通過“maxmetaspacesize”參數(shù)設定的128mb 人小的metaspace內存空間。首先建立了一個模擬permgen 00m的代碼 public class classa public void method(string name) / do nothing上面是一個簡單的classa,把他編譯成class字節(jié)碼放到d: /classes下面, 測試代碼中用urlclassloader來加載此類型上面類編譯成class/* 模擬 permgen 00m* ©author ben

8、hail*/public class oomtest public static void main(string args) try /準備urlurl url 二 new file(,d:/classes,/). touri(). tourl();url urls 二url;/獲取有關類型加載的jmx接口c1assloadingmxbean loadingbean 二managementfactory. getclassloadingmxbean();用于緩存類加載器li st<classloader> classloaders 二 newarraylist<classl

9、oadcr> ();while (true) 加載類型并緩存類加載器實例classloader classloader 二 new urlclassloader(urls); classloaders. add(classloader);classloader loadcleiss ("classa");/顯示數(shù)量信息(共加載過的類型數(shù)目,當前述冇效的類型數(shù) 目,已經被卸載的類型數(shù)目)system, out. println("total: " +loadingbean. gettotalloadedclasscount();system .out

10、. println("active: " +loadingbean getloadedclasscount();system, outprintin("unloaded: " +loadingbean. getunioadedclasscount(); catch (exception e) e. printstacktrace ();虛擬機器參數(shù)設置如下:-verbose -verbose:go設置-verbose參數(shù)是為了獲取類型加載和卸載的信息設置-verbose:gc是為了獲取垃圾收集的相關信息jdk 1. 7 64-bit - permgen

11、耗盡測試javal. 7的permgen默認空間為85 mb (或者可以通過-xx:maxpermsize=xxxm指 定)正常運行時間=0分14秒cpux大小:85, 983, 232個乍最犬:85,983,232個呂7550250 mb _i19:04:12線程已裝入的總數(shù):61,956已卸載的總數(shù):32共享的已裝入數(shù):0共享的已卸戟數(shù):0活動:11 實時山星值:111 隹 permgen可以從上而的jvisualvm的截圖看出:當加載超過6萬個類z后,permgen被耗 盡。我們也能通過程序和gc的輸岀觀察耗盡的過程。程序輸出(摘取了部分)loaded classa from fi1e:

12、/d:/c1 asses/ total: 64887active: 64887unloaded: 0gc 245041k->213978k(536768k), 0.0597188 secsfull gc 213978k->211425k(644992k), 0.6456638 secsgc 211425k->211425k (656448k), 0.0086696 secs full gc 211425k->21141ik(731008k), 0.6924754 secs gc 211411k->21141ik(726528k), 0.0088992 secsja

13、va.lang. outofmcmoryerror: pcrmgcn spacejdk 1. 8 64-bit - metaspace大小動態(tài)調整測試java的metaspace空間:不受限制(默認)cpuxmwtaspace堆大小:646, 889, 472個宇節(jié)線程已裝入的總數(shù):105, 324已卸載的總數(shù):0共享的已裝入數(shù):0共享的已卸載數(shù):0已裝入的類的總數(shù)共享的已裝入類數(shù)舌動:10 實時謔值:10從上面的截圖叮以看到,jvm metaspace進行了動態(tài)擴展,本地內存的使用由20mb 增長到646mb,以滿足程序屮不斷增長的類數(shù)據(jù)內存占用需求。我們也能觀察到 jvm的垃圾回收事件一試

14、圖銷毀僵死的類或類加載器對象。但是,由于我們程序 的泄漏,jvm別無選擇只能動態(tài)擴展metaspace內存空間。程序加載超過10萬 個類,而沒有出現(xiàn)00m事件。jdk 1.8 64-bit - metaspace 受限測試java 的 metaspace 空間:128mb (-xx:maxmetaspacesize=128m)堆 metaspace犬小:131,072, 000個字節(jié) 最大:1,082,130, 432個字節(jié)10050 mb-i0 me i19:26:15類已裝入的總數(shù):21,366已卸載的總敎:3220.0x-共享的已裝入數(shù):0共享的已卸截數(shù):010,000-° 1

15、9:26:151119:26:2019:26:25已裝入的類的總數(shù)共享的已裝入類數(shù)線程活動:919:26:15可以從上面的jvisualvm的截圖看出:當加載超過2萬個類之后,metaspace被 耗盡;與jdk1. 7運行吋非常相似。我們也能通過程序和gc的輸出觀察耗盡的過 程。另一個有趣的現(xiàn)象是,保留的原生內存占用量是設定的最大大小兩倍z多。 這可能表明,如果可能的話,可微調元空間容量大小策略,來避免本地內存的浪 費。從java程序的輸出屮看到如下異常。loaded classa from file:/d:/classes/total: 21393active: 21393unloaded

16、: 0gc (metadata gc threshold) 64306k->57010k(111616k), 0.0145502 secs full gc (metadata gc threshold) 57010k->56810k(122368k), 0.1068084 secsjava. lang. outofmcmoryerror: metaspace在設置了 maxmetaspacesize的情況下,該空間的內存仍然會耗盡,進1何引發(fā) u java. lang. outofmemoryerror: metadata spacev 錯誤。因為類加載器的泄漏 仍然存在,而通常java又不希望無限制地消耗木機內存,因此設置一個類似于 maxpermsize的限制看起來也

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論