很多開發(fā)者都在其系統(tǒng)中見過“java.lang.OutOfMemoryError: PermGen space”這一問題。這往往是由類加載器相關(guān)的內(nèi)存泄漏以及新類加載器的創(chuàng)建導(dǎo)致的,通常出現(xiàn)于代碼熱部署時。相對于正式產(chǎn)品,該問題在開發(fā)機上出現(xiàn)的頻率更高,在產(chǎn)品中最常見的“問題”是默認值太低了。常用的解決方法是將其設(shè)置為256MB或更高。
創(chuàng)新互聯(lián)公司專注于湄潭企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城網(wǎng)站建設(shè)。湄潭網(wǎng)站建設(shè)公司,為湄潭等地區(qū)提供建站服務(wù)。全流程定制設(shè)計,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)PermGen space簡單介紹
PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域,說說為什么會內(nèi)存益出:這一部分用于存放Class和Meta的信息,Class在被 Load的時候被放入PermGen space區(qū)域,它和和存放Instance的Heap區(qū)域不同,所以如果你的APP會LOAD很多CLASS的話,就很可能出現(xiàn)PermGen space錯誤。這種錯誤常見在web服務(wù)器對JSP進行pre compile的時候。
JVM 種類有很多,比如 Oralce-Sun Hotspot, Oralce JRockit, IBM J9, Taobao JVM(淘寶好樣的?。┑鹊?。當然武林盟主是Hotspot了,這個毫無爭議。需要注意的是,PermGen space是Oracle-Sun Hotspot才有,JRockit以及J9是沒有這個區(qū)域。
元空間(MetaSpace)一種新的內(nèi)存空間誕生
JDK8 HotSpot JVM 將移除永久區(qū),使用本地內(nèi)存來存儲類元數(shù)據(jù)信息并稱之為:元空間(Metaspace);這與Oracle JRockit 和IBM JVM's很相似,如下圖所示
這意味著不會再有java.lang.OutOfMemoryError: PermGen問題,也不再需要你進行調(diào)優(yōu)及監(jiān)控內(nèi)存空間的使用……但請等等,這么說還為時過早。在默認情況下,這些改變是透明的,接下來我們的展示將使你知道仍然要關(guān)注類元數(shù)據(jù)內(nèi)存的占用。請一定要牢記,這個新特性也不能神奇地消除類和類加載器導(dǎo)致的內(nèi)存泄漏。
java8中metaspace總結(jié)如下:
PermGen 空間的狀況
這部分內(nèi)存空間將全部移除。
JVM的參數(shù):PermSize 和 MaxPermSize 會被忽略并給出警告(如果在啟用時設(shè)置了這兩個參數(shù))。
Metaspace 內(nèi)存分配模型
大部分類元數(shù)據(jù)都在本地內(nèi)存中分配。
用于描述類元數(shù)據(jù)的“klasses”已經(jīng)被移除。
Metaspace 容量
默認情況下,類元數(shù)據(jù)只受可用的本地內(nèi)存限制(容量取決于是32位或是64位操作系統(tǒng)的可用虛擬內(nèi)存大小)。
新參數(shù)(MaxMetaspaceSize)用于限制本地內(nèi)存分配給類元數(shù)據(jù)的大小。如果沒有指定這個參數(shù),元空間會在運行時根據(jù)需要動態(tài)調(diào)整。
Metaspace 垃圾回收
對于僵死的類及類加載器的垃圾回收將在元數(shù)據(jù)使用達到“MaxMetaspaceSize”參數(shù)的設(shè)定值時進行。
適時地監(jiān)控和調(diào)整元空間對于減小垃圾回收頻率和減少延時是很有必要的。持續(xù)的元空間垃圾回收說明,可能存在類、類加載器導(dǎo)致的內(nèi)存泄漏或是大小設(shè)置不合適。
Java 堆內(nèi)存的影響
一些雜項數(shù)據(jù)已經(jīng)移到Java堆空間中。升級到JDK8之后,會發(fā)現(xiàn)Java堆 空間有所增長。
Metaspace 監(jiān)控
元空間的使用情況可以從HotSpot1.8的詳細GC日志輸出中得到。
Jstat 和 JVisualVM兩個工具,在使用b75版本進行測試時,已經(jīng)更新了,但是還是能看到老的PermGen空間的出現(xiàn)。
前面已經(jīng)從理論上充分說明,下面讓我們通過“泄漏”程序進行新內(nèi)存空間的觀察……
PermGen vs. Metaspace 運行時比較
為了更好地理解Metaspace內(nèi)存空間的運行時行為,
將進行以下幾種場景的測試:
1.使用JDK1.7運行Java程序,監(jiān)控并耗盡默認設(shè)定的85MB大小的PermGen內(nèi)存空間。
2.使用JDK1.8運行Java程序,監(jiān)控新Metaspace內(nèi)存空間的動態(tài)增長和垃圾回收過程。
3.使用JDK1.8運行Java程序,模擬耗盡通過“MaxMetaspaceSize”參數(shù)設(shè)定的128MB大小的Metaspace內(nèi)存空間。
首先建立了一個模擬PermGen OOM的代碼
public class ClassA { public void method(String name) { // do nothing } }
網(wǎng)站欄目:Java8新特性之再見Permgen_動力節(jié)點Java學院整理-創(chuàng)新互聯(lián)
路徑分享:http://aaarwkj.com/article38/jsspp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、小程序開發(fā)、網(wǎng)站導(dǎo)航、搜索引擎優(yōu)化、建站公司、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)