999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Java內存不足PermGen space錯誤探究

2012-04-29 07:00:52錢宇虹
軟件工程 2012年11期
關鍵詞:設置區域

錢宇虹

摘要:Java程序運行時可能會遇到java.lang.OutOfMemoryError: PermGen space錯誤;JavaEE服務器(如tomcat、jboss等)在加載war包或ear包時也可能會出現這種錯誤,這些都是由于永久保存區域內存不足導致的。本文分析了Java程序的運行機制和JVM的內存結構,解釋了什么是permanent generation space,分析了PermGen space錯誤的常見原因,并給出避免這一錯誤的解決辦法。

關鍵詞:JVM; 類加載器; OutOfMemoryError:PermGen space

Java 程序的運行機制與普通程序,如C或C++ 程序的運行機制有很大的區別。

普通程序運行之前必須首先編譯成可執行的二進制碼或機器碼。機器碼是與底層的硬件結構相關的,即使書寫源代碼的時候沒有利用平臺特定的擴展語言,如特定的文件訪問或圖形用戶界面,生成的機器碼仍然被綁定到一個特定的硬件平臺,從而只能運行在那個體系結構上,也就是說,為Sun工作站編譯的機器碼不能運行在PC機上,為PC機編譯的機器碼不能運行在蘋果機上,以此類推。

與此相反,Java源代碼不是為某種特定平臺編譯的,而是編譯成與平臺無關的字節碼(Byte Code),這種字節碼叫做Java Class(Java 類文件) 。在任何一種操作系統平臺上的字節碼都是一樣的,因此都可以在任何支持Java 虛擬機(JVM)的計算機上運行。JVM 直接受操作系統控制(而不是Java程序直接受操作系統控制),它負責將字節碼轉換成在特定平臺上能夠運行的機器碼。正是由于這個原因,Java做到了“write once, run anywhere”(書寫一次,到處運行)[1]。

運行Java程序時,首先需要由JVM把Java class加載到JVM里面。通常情況下,我們不會去關注JVM的內部工作細節而只是直接拿來使用。然而,作為一個Java開發人員,你經常會遇到與內存相關的性能問題。這個問題最可怕的就是OutOfMemoryError:PermGen space錯誤。

這個錯誤通常會在以下三種情況下發生(服務器以Tomcat為例):

(1)應用程序加載了大量的類。

(2)在單一的Tomcat實例下運行多個Web應用程序。

(3)在運行的Tomcat實例中反復“熱部署”Web應用程序。

下面我們對該錯誤進行探究,分析該錯誤的常見原因,并給出避免這一錯誤的解決辦法。

1.JVM 的內存結構

為了理解這一錯誤,我們必須了解JVM的內存是如何構造的。

JVM有兩個內存區域,一個是堆(heap),另一個是棧(stack)。局部的變量和方法駐留在棧里面,其余的一切都駐留在堆中。

Java的堆又進一步按照區域進行組織,這些區域被稱為generation。一個對象在JVM存在的時間越長,它被升遷到老的generation中的幾率就越高。年輕的generation要比老的generation更多地被垃圾回收。同時還存在一些單獨的堆空間,被稱為永久保存區域(permanent generation),它們不屬于Java堆的一部分,用來存放類和類的描述。

類加載器的工作是不斷地部署和取消部署Java類。例如,將一個Web應用程序部署到Web服務器或取消部署。在Web服務器上,所有應用程序都有自己的類加載器,部署或取消部署應用程序時,它的類定義和類加載器分別投入到永久保存區域中或者從永久保存區域中刪除。

2.OutOfMemoryError: PermGen space

當永久保存區域的空間耗盡時OutOfMemoryError: PermGen space就會發生,這個錯誤一般是由于內存泄漏導致的。所謂內存泄漏,是指java類和類加載器在被取消部署后不能被垃圾回收[2]。怎么會發生這種情況呢?舉個例子:假如我們有一個Student類,這個類是Web應用程序jar包的一部分,同時在Web服務器的lib文件夾中包含了某種日志框架,其中有一個Log類提供register方法調用,從而使得別的類通過注冊就可以使用日志功能。如果Student類被注冊了,那么Log類就開始擁有了一個對Student對象的引用(reference)。當Student類取消部署時,它仍然是注冊Log類的,Log類仍然擁有對Student對象的引用,因此,Student對象永遠不會被垃圾回收。此外,由于Student對象擁有一個對它的ClassLoader的引用,所以ClassLoader本身永遠也不會被垃圾回收,從而導致由它加載的所有類都不會被回收。

一個更為典型的例子是使用代理對象。Spring和Hibernate常常為某些類生成代理類,這些代理類也是通過類加載器加載的,并且存儲在永久保存區域的堆空間,它們永遠不會被丟棄,從而會導致永久保存區域的堆空間被填滿。

3.如何避免永久保存區域內存不足

3.1 增加PermGen堆的最大尺寸

當遇到java.lang.OutOfMemoryError:PermGen space錯誤時,我們可以做的第一件事情是增加永久保存區域的最大尺寸,該尺寸的缺省設置是64 M,我們可以將它設置成128 M以上。這個工作不能通過常規的JVM參數 -Xms(設置初始堆大小)和-Xmx(設置最大堆大小)來完成,因為前面已經提到,永久保存區域完全獨立于普通的Java堆,這些參數是用來設置普通的Java堆的。不過也有類似參數用于設置永久保存區域的規模:

java-XX:MaxPermSize=128 M

該設置將永久保存區域設置為128 M,這個大小是默認設置的兩倍。

對于Tomcat服務器,則需要修改TOMCAT_HOME/bin/catalina.sh

SET JAVA_OPTS=-XX:PermSize=64 M -XX:MaxPermSize=128 M [3]

3.2 避免使用靜態字段

確保在編寫Java類時,不要使用靜態變量作為對其他對象的引用。

3.3使用JDK動態代理,而不是CGLIB代理

一些第三方的框架,如CGLIB會吞食大量的PermGen。因此,當遇到PermGen錯誤時,應盡快升級cglib到最新版;改用JDK動態代理,也是一個不錯的選擇。

3.4更新到最新版本Hibernate3.2

此外,新版本的Hibernate不再使用CGLIB作為字節碼提供者了,所以及時升級Hibernate,會大大降低出錯的機會。

3.5共用的jar文件放到共享目錄下

如果在服務器上同時發布了多個應用,那么應該把共用的jar文件放到所有應用都可以訪問的目錄下。針對Tomcat而言,如果Tomcat下面有多個應用,應盡可能地把lib目錄下共用的jar文件放到Tomcat的common\lib或shared\lib下,以避免重復發布,發布速度和運行速度上也會有所提升。

4.結束語

內存不足問題是潛伏較深的問題,且不容易解決。一般情況下,當發生該錯誤的時候,需要確定為什么某些類不被垃圾回收,只有這樣做才能夠消除這個錯誤。

參考文獻

[1] Jacquie Barker.Beginning Java Objects From Concept to Code[M] . Birmingham, UK. Published by Wrox Press Ltd.,2000.

[2]Oracle Docs, Chapter 3, Troubleshooting Memory Leaks,

http://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/memleaks.html.

[3] Eric Simmerman,Preventing Java's java.lang.OutOfMemoryError: PermGen space failure [EB],2006.

猜你喜歡
設置區域
永久基本農田集中區域“禁廢”
今日農業(2021年9期)2021-11-26 07:41:24
中隊崗位該如何設置
少先隊活動(2021年4期)2021-07-23 01:46:22
分割區域
7招教你手動設置參數
關于四色猜想
分區域
本刊欄目設置說明
中俄臨床醫學專業課程設置的比較與思考
基于嚴重區域的多PCC點暫降頻次估計
電測與儀表(2015年5期)2015-04-09 11:30:52
艦船人員編制的設置與控制
主站蜘蛛池模板: 精品一区国产精品| 一级毛片在线播放免费观看| 国产色网站| 成人精品亚洲| 国产后式a一视频| 久久精品午夜视频| 朝桐光一区二区| 欧美视频在线观看第一页| 国产女同自拍视频| 亚洲无码91视频| 久久国产亚洲欧美日韩精品| 亚洲开心婷婷中文字幕| 国产精品尹人在线观看| …亚洲 欧洲 另类 春色| 无码视频国产精品一区二区| 亚洲男人天堂2018| 国产又色又刺激高潮免费看| 精品超清无码视频在线观看| 国产97视频在线| 无码福利日韩神码福利片| 免费观看国产小粉嫩喷水| 一区二区无码在线视频| 香蕉综合在线视频91| 成人字幕网视频在线观看| 亚洲成a人片| 日韩精品一区二区三区swag| 呦女亚洲一区精品| 波多野结衣亚洲一区| 欧美色图久久| 九九热在线视频| 中文字幕天无码久久精品视频免费| 久久久久久尹人网香蕉| 99久久国产综合精品女同| 国产精品自在线天天看片| 亚洲AV无码一区二区三区牲色| 亚洲天堂成人在线观看| 欧美天堂在线| 性网站在线观看| AⅤ色综合久久天堂AV色综合 | 91久久偷偷做嫩草影院电| 午夜国产大片免费观看| 亚洲天堂网在线播放| 国产永久在线视频| 人妻一本久道久久综合久久鬼色| 亚洲高清中文字幕| 国产精品色婷婷在线观看| 国产流白浆视频| 手机在线看片不卡中文字幕| 国产丝袜啪啪| 亚洲国产中文欧美在线人成大黄瓜| 99热这里只有精品免费| 中文字幕无码制服中字| 一区二区在线视频免费观看| 国内丰满少妇猛烈精品播| 精品无码视频在线观看| 天堂成人在线| 欧美伦理一区| 国产在线视频福利资源站| 91精品人妻互换| 国产精品开放后亚洲| 无遮挡国产高潮视频免费观看 | 999国内精品久久免费视频| 亚洲男人天堂网址| 国产成人免费视频精品一区二区 | 婷婷色狠狠干| 久久综合结合久久狠狠狠97色| 成人精品午夜福利在线播放| 亚洲一本大道在线| 亚洲aaa视频| 4虎影视国产在线观看精品| 国产91熟女高潮一区二区| 在线欧美国产| 亚洲无码精品在线播放| 激情亚洲天堂| 欧美不卡二区| 色综合中文| 欧美日韩第三页| 高清码无在线看| 精品国产一二三区| 69国产精品视频免费| 国产流白浆视频| 五月婷婷丁香色|