摘要:本Blog主要為了闡述java.lang.OutOfMemoryError:PermGenspace可能產生的原因及解決方式。
當中PermGen space是Permanent Generationspace的簡寫,表示內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGenspace中,它和存放類實例(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程序執行期對PermGen space進行清理。所以假設你的應用中有非常多CLASS的話,就非常可能出現PermGen space錯誤。
內容簡單介紹:
第一部分:原理解析(為什么為出現這種原因)
第二部分:實際應用分析及解決方式參考
第三部分:安裝版的Tomcat如何設置JAVA_OPTS
第四部分:如何在eclipse中設置TOMCAT內存大小。解決啟動時內存溢出
第一部分:原理解析:
1、String事實上是沒有限制的。而是當String太大了,超過JVM的自身的內存后會拋出java.lang.OutOfMemoryError錯誤,String是沒有長度限制的,而是有JVM的內存限制了String的長度。
同一時候說明,並不會拋出不論什么Exception而僅僅會拋出Error。
OutMemoryError表明程序的設計差。或者遇到了超出編程人員所預想的大批量的數據。
無論哪種情況,都僅僅有以下這幾種解決的方法。它們是:
A、設計人員又一次設計程序。不致使程序一次加載全部的數據。
B、數據能夠切割成更小的塊。
C、能夠為程序分配很多其它的內存。
D、為Java虛擬機提供很多其它的內存。
2、一般都是發生在開啟大型檔案或跟數據庫一次載入太多的數據,造成 Out Of MemoryError 的狀況,這時就大概要計算一下數據量的最大值是多少。而且設定所需最小及最大的內存空間值。還有一種狀況平時比較難查覺。
就是 Servlet 或 JSP 的 Container 突然同一時候上線人數爆增,也相對造成內存需求不足,所以也必需要計算出程序所需的數據量*同一時候上線人數,來設定內存的需求量。
(假設要有最佳化的值。最好是配合 gc 做調校)
3、當 CPU 速度愈快,內存的最小需求量也就必需愈大。原因是 CPU 愈快,短時間內能處理的數據量也就愈大,所以在 java 做 GC 之前,可能已經內存已經消耗完了。所以 CPU 的速度也是內存初始需求量的重要因素之中的一個。
解決方法:
改動JAVA_OPTS="-Xms1024m-Xmx1024m" 或更大,依據系統內存情況
jsp開發中有關java.lang.OutOfMemoryError的產生及解決方法
第二部分:實際應用場景及解決方式參考(例如以下是server版——解壓縮版本號):
預准備(各種環境中文件的位置) |
【Windows】在catalina.bat的第一行添加: set JAVA_OPTS=-Xms512m -Xmx900m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m |
一、java.lang.OutOfMemoryError: PermGenspace
PermGen space的全稱是PermanentGeneration space,是指內存的永久保存區域,
這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGen space中,它和存放類實例(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程序執行期對PermGen space進行清理,所以假設你的應用中有非常多CLASS的話,就非常可能出現PermGenspace錯誤,這樣的錯誤常見在webserver對JSP進行precompile的時候。假設你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那么就會產生此錯誤信息了。
解決方法: 手動設置MaxPermSize大小
改動TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面增加下面行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建議:將同樣的第三方jar文件移置到tomcat/shared/lib文件夾下,這樣能夠達到降低jar 文檔反復占用內存的目的。
二、java.lang.OutOfMemoryError:Java heap space
Heap size 設置:
JVM堆的設置是指java程序執行過程中JVM能夠調配使用的內存空間的設置.JVM在啟動的時候會自己主動設置Heap size的值,其初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。
能夠利用JVM提供的-Xmn -Xms -Xmx等選項可進行設置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示一:在JVM中假設98%的時間是用於GC且可用的Heap size 不足2%的時候將拋出此異常信息。
提示二:Heap Size 最大不要超過可用物理內存的80%,一般的要將-Xms和-Xmx選項設置為同樣,而-Xmn為1/4的-Xmx值。
解決方法:手動設置Heap size
改動TOMCAT_HOME/bin/catalina.sh
在“echo "UsingCATALINA_BASE: $CATALINA_BASE"”上面增加下面行:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
三、實例。下面給出1G內存環境下java jvm 的參數設置參考:
JAVA_OPTS="-server -Xms800m-Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m-XX:MaxPermSize=128m -Djava.awt.headless=true "
大家都知道,JAVA程序啟動時都會JVM都會分配一個初始內存和最大內存給這個應用程序。
這個初始內存和最大內存在一定程度都會影響程序的性能。比方說在應用程序用到最大內存的時候,JVM是要先去做垃圾回收的動作,釋放被占用的一些內存。
所以想調整Tomcat的啟動時初始內存和最大內存就須要向JVM聲明。一般的JAVA程序在執行都能夠通過中-Xms -Xmx來調整應用程序的初始內存和最大內存:
如:java -Xms64m -Xmx128m a.jar.
tomcat的啟動程序是包裝過的,不能直接使用java -X..... tomcat.*來改變內存的設置。
在Tomcat在改變這個設置有兩種方法:
1. 就須要在環境變量中加上TOMCAT_OPTS, CATALINA_OPTS兩個屬性。
如 SET CATALINA_OPTS= -Xms64m -Xmx512m;
ms是最小的。mx是最大。64m, 512m各自是指內存的容量.
2. 改動Catalina.bat文件
在166行“rem Execute Java with the applicable properties ”下面每行
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS%-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath"%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%"-Dcatalina.home="%CATALINA_HOME%"-Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS%%ACTION% 中的%CATALINA_OPTS% 替換成-Xms64m-Xmx512m
第三部分:假設是安裝版的tomcat如何設置JAVA_OPTS
JAVA_OPTS="-Xms128M-Xmx512M -XX:PermSize=128M -XX:MaxPermSize=512M"
tomcat假設是通過windows服務啟動,運行的是bin\tomcat.exe.他讀取注冊表中的值,而不是catalina.bat的設置.
解決的方法:
改動注冊表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun2.0\Tomcat6\Parameters\JavaOptions
原值為
-Dcatalina.home=E:\Tomcat 6.0
-Dcatalina.base=E:\Tomcat 6.0
-Djava.endorsed.dirs=E:\Tomcat 6.0\common\endorsed
-Djava.io.tmpdir=E:\Tomcat 6.0\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=E:\Tomcat6.0\conf\logging.properties
在后面添加就可以:
-Xms128M
-Xmx512M
-XX:PermSize=128M
-XX:MaxPermSize=512M
必需要分行寫。
終於效果例如以下:(細節注解:將對應的信息增加Java Options輸入框的后面就可以)
第四部分:eclipse中設置TOMCAT內存大小,解決啟動時內存溢出
有時在ECLIPSE中啟動TOMCAT會出現內存溢出和轉換錯誤等莫名奇異的錯誤,這些非常有可能是內存不夠引起的。這時能夠在設置中找到Server然后找到Tomcat找到相應的版本號。
方法一:永久設置JVM對應的參數值:
通過Windows下的Preferences找到Tomcat中的JVM Settings中的Append to JVMParameters進行對應的參數設置:
-Xms128m -Xmx512m -XX:PermSize=256M-XX:MaxNewSize=128m -XX:MaxPermSize=512m
例如以下圖所看到的:
方法二:暫時設置對應的參數——在eclipse中進行例如以下步驟設置:
1、點擊eclipse上的debug圖標旁邊的下拉箭頭
2、然后選擇Debug Configurations,
3、系統彈出設置tomcat配置頁面。在Argument中末尾加入參數中的VM arguments中追加:
-Xms256M-Xmx512M -XX:PermSize=256m -XX:MaxPermSize=512m
參數的意思
-vmargs:說明后面是VM的參數
-Xms40m:虛擬機占用系統的最小內存
-Xmx256m:虛擬機占用系統的最大內存
-XX:PermSize:最小棧內存大小。
一般報內存不足時,都是說這個太小,堆空間剩余小於5%就會警告,建議把這個略微設大一點,只是要視自己機器內存大小來設置
-XX:MaxPermSize:最大棧內存大小。
這個也適當大些
-Xmx512M的5%為25.6M。理論上要求-Xmx的數值與-XX:MaxPermSize必須大於25.6M
參考文獻:
http://blog.csdn.net/hdfyq/article/details/5856284
http://blog.csdn.net/w420372197/article/details/7878404
http://piranha.iteye.com/blog/1574040
http://116.255.173.144/?c=article&a=read&id=59498
http://my.oschina.net/colorleaf/blog/175581