A. java -Xmx參數的設置問題
如果樓主的內存是16G的話,不妨可以裝64位的JDK(當然操作系統也要64bit),並確認開啟了指針壓縮(64位的JDK相對於32位JDK要更耗內存),這樣就基本沒有內存限制了。堆內存可以設置為一半,8G,這個要看你的應用規模了。當然,如果樓主使用的是hotspot虛擬機的話,堆裡面各個代(新生代,老生代,PermGen)的大小也需要好好設置一下。一般來說,新生代設置(-XX:NewSize=...)為堆大小的3/8,PermGen(-XX:PermSize=512m, -XX:MaxPermSize=512m)有512m足夠了。總的來說,要看應用的需求。
B. Tomcat 環境中,Java 內存 堆的調整
設置Tomcat啟動的初始內存其初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。
可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設置
三、實例,以下給出1G內存環境下java jvm 的參數設置參考:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
JAVA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX: NewSize=192m -XX:MaxNewSize=384m"
CATALINA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m"
Linux:
在/usr/local/apache-tomcat-5.5.23/bin 目錄下的catalina.sh添加:
JAVA_OPTS='-Xms512m -Xmx1024m'要加「m」說明是MB,否則就是KB了,在啟動tomcat時會 報內存不足。
-Xms:初始值-Xmx:最大值-Xmn:最小值
Windows
在catalina.bat最前面加入set JAVA_OPTS=-Xms128m -Xmx350m
如果用startup.bat啟動tomcat,OK設置生效.夠成功的分配200M內存.
但是如果不是執行startup.bat啟動tomcat而是利用windows的系統服務啟動tomcat服務,上面的設置就不生效了,就是說set JAVA_OPTS=-Xms128m -Xmx350m 沒起作用.上面分配200M內存就OOM了..
windows服務執行的是bin\tomcat.exe.他讀取注冊表中的值,而不是catalina.bat的設置.
解決辦法:
修改注冊表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions
原值為-Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"-Xrs加入 -Xms300m -Xmx350m
重起tomcat服務,設置生效
答案2Tomcat 的JVM 內存溢出問題的解決關鍵字: tomcat 的jvm 內存溢出問題的解決
最近在熟悉一個開發了有幾年的項目,需要把資料庫從mysql移植到oracle,首先把jdbc的連接指向mysql,打包放到tomcat裡面,可以跑起來,沒有問題,可是當把jdbc連接指向oracle的時候,tomcat就連續拋java.lang.OutOfMemoryError的錯誤,上網google了一下,了解了一下tomcat的運行機制,也解決了問題,share出來,以備查。
1、首先是: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.bat,在「echo "Using CATALINA_BASE: $CATALINA_BASE"」上面加入以下行: Java代碼 set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m 或修改catalina.sh 在「echo "Using CATALINA_BASE: $CATALINA_BASE"」上面加入以下行: JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
2、其次是:java.lang.OutOfMemoryError: PermGen space 原因: PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGen space中,它和存放類實例(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的應用中有很CLASS的話,就很可能出現PermGen space錯誤,這種錯誤常見在web伺服器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那麼就會產生此錯誤信息了。
解決方法: 1. 手動設置MaxPermSize大小 修改TOMCAT_HOME/bin/catalina.bat(Linux下為catalina.sh),在Java代碼 「echo "Using CATALINA_BASE: $CATALINA_BASE"」上面加入以下行: set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m 「echo "Using CATALINA_BASE: $CATALINA_BASE"」上面加入以下行: set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m catalina.sh下為: Java代碼 JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m" JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"
另外看到了另外一個帖子,覺得挺好,摘抄如下:
分析java.lang.OutOfMemoryError: PermGen space 發現很多人把問題歸因於: spring,hibernate,tomcat,因為他們動態產生類,導致JVM中的permanent heap溢出 。然後解決方法眾說紛紜,有人說升級 tomcat版本到最新甚至乾脆不用tomcat。還有人懷疑spring的問題,在spring論壇上討論很激烈,因為spring在AOP時使用CBLIB會動態產生很多類。 但問題是為什麼這些王牌的開源會出現同一個問題呢,那麼是不是更基礎的原因呢?tomcat在Q&A很隱晦的回答了這一點,我們知道這個問題,但這個問題是由一個更基礎的問題產生。 於是有人對更基礎的JVM做了檢查,發現了問題的關鍵。原來SUN 的JVM把內存分了不同的區,其中一個就是permenter區用來存放用得非常多的類和類描述。本來SUN設計的時候認為這個區域在JVM啟動的時候就固定了,但他沒有想到現在動態會用得這么廣泛。而且這個區域有特殊的垃圾收回機制,現在的問題是動態載入類到這個區域後,gc根本沒辦法回收!
對於以上兩個問題,我的處理是:
在catalina.bat的第一行增加:
Java代碼 :set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
在catalina.sh的第一行增加:
Java代碼 :JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
C. java xms 默認值
在一些規模稍大的應用中,Java虛擬機(JVM)的內存設置尤為重要,想在項目中取得好的效率,GC(垃圾回收)的設置是第一步。
PermGen space:全稱是Permanent Generation space.就是說是永久保存的區域,用於存放Class和Meta信息,Class在被Load的時候被放入該區域Heap space:存放Instance。
GC(Garbage Collection)應該不會對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS的話,就很可能出現PermGen space錯誤
Java Heap分為3個區
1.Young
2.Old
3.Permanent
Young保存剛實例化的對象。當該區被填滿時,GC會將對象移到Old區。Permanent區則負責保存反射對象,本文不討論該區。
JVM的Heap分配可以使用-X參數設定,
-Xms
初始Heap大小
-Xmx
java heap最大值
-Xmn
young generation的heap大小
JVM有2個GC線程
第一個線程負責回收Heap的Young區
第二個線程在Heap不足時,遍歷Heap,將Young 區升級為Older區
Older區的大小等於-Xmx減去-Xmn,不能將-Xms的值設的過大,因為第二個線程被迫運行會降低JVM的性能。
為什麼一些程序頻繁發生GC?
有如下原因:
1.程序內調用了System.gc()或Runtime.gc()。
2.一些中間件軟體調用自己的GC方法,此時需要設置參數禁止這些GC。
3.Java的Heap太小,一般默認的Heap值都很小。
4.頻繁實例化對象,Release對象 此時盡量保存並重用對象,例如使用StringBuffer()和String()。
如果你發現每次GC後,Heap的剩餘空間會是總空間的50%,這表示你的Heap處於健康狀態,許多Server端的Java程序每次GC後最好能有65%的剩餘空間
經驗之談:
1.Server端JVM最好將-Xms和-Xmx設為相同值。為了優化GC,最好讓-Xmn值約等於-Xmx的1/3。
2.一個GUI程序最好是每10到20秒間運行一次GC,每次在半秒之內完成。
注意:
1.增加Heap的大小雖然會降低GC的頻率,但也增加了每次GC的時間。並且GC運行時,所有的用戶線程將暫停,也就是GC期間,Java應用程序不做任何工作。
2.Heap大小並不決定進程的內存使用量。進程的內存使用量要大於-Xmx定義的值,因為Java為其他任務分配內存,例如每個線程的Stack等。
Stack的設定
每個線程都有他自己的Stack。
-Xss
每個線程的Stack大小
Stack的大小限制著線程的數量。如果Stack過大就好導致內存溢漏。-Xss參數決定Stack大小,例如-Xss1024K。如果Stack太小,也會導致Stack溢漏。
硬體環境
硬體環境也影響GC的效率,例如機器的種類,內存,swap空間,和CPU的數量。
如果你的程序需要頻繁創建很多transient對象,會導致JVM頻繁GC。這種情況你可以增加機器的內存,來減少Swap空間的使用。
4種GC
1、第一種為單線程GC,也是默認的GC,該GC適用於單CPU機器。
2、第二種為Throughput GC,是多線程的GC,適用於多CPU,使用大量線程的程序。第二種GC與第一種GC相似,不同在於GC在收集Young區是多線程的,但在Old區和第一種一樣,仍然採用單線程。-XX:+UseParallelGC參數啟動該GC。
3、第三種為Concurrent Low Pause GC,類似於第一種,適用於多CPU,並要求縮短因GC造成程序停滯的時間。這種GC可以在Old區的回收同時,運行應用程序。-XX:+UseConcMarkSweepGC參數啟動該GC。
4、第四種為Incremental Low Pause GC,適用於要求縮短因GC造成程序停滯的時間。這種GC可以在Young區回收的同時,回收一部分Old區對象。-Xincgc參數啟動該GC。
單文件的JVM內存進行設置
默認的java虛擬機的大小比較小,在對大數據進行處理時java就會報錯:java.lang.OutOfMemoryError。
設置jvm內存的方法,對於單獨的.class,可以用下面的方法對Test運行時的jvm內存進行設置。
java -Xms64m -Xmx256m Test
-Xms是設置內存初始化的大小
-Xmx是設置最大能夠使用內存的大小(最好不要超過物理內存大小)
tomcat啟動jvm內存設置
Linux:
在/usr/local/apache-tomcat-5.5.23/bin目錄下的catalina.sh添加:JAVA_OPTS='-Xms512m -Xmx1024m'要加「m」說明是MB,否則就是KB了,在啟動tomcat時會報內存不足。
-Xms:初始值
-Xmx:最大值
-Xmn:最小值Windows
在catalina.bat最前面加入
set JAVA_OPTS=-Xms128m -Xmx350m 如果用startup.bat啟動tomcat,OK設置生效.夠成功的分配200M內存.但是如果不是執行startup.bat啟動tomcat而是利用windows的系統服務啟動tomcat服務,上面的設置就不生效了,就是說set JAVA_OPTS=-Xms128m -Xmx350m 沒起作用.上面分配200M內存就OOM了..windows服務執行的是bin\tomcat.exe.他讀取注冊表中的值,而不是catalina.bat的設置.解決辦法:
修改注冊表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions
D. 求解釋各參數意思JAVA_OPTS "-Xms1200m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=256m"
-Xms128m
表示JVM Heap(堆內存)最小尺寸128MB,初始分配
-Xmx512m
表示JVM
Heap(堆內存)最大允許的尺寸256MB,按回需分配。
說明:如果-Xmx不指答定或者指定偏小,應用可能會導致java.lang.OutOfMemory錯誤,此錯誤來自JVM不是Throwable的,無法用try...catch捕捉。
PermSize和MaxPermSize指明虛擬機為java永久生成對象(Permanate
generation)如,class對象、方法對象這些可反射(reflective)對象分配內存限制,這些內存不包括在Heap(堆內存)區之中。
-XX:PermSize=64MB
最小尺寸,初始分配
-XX:MaxPermSize=256MB
最大允許分配尺寸,按需分配
過小會導致:java.lang.OutOfMemoryError: PermGen
space
MaxPermSize預設值和-server
-client選項相關。
-server選項下默認MaxPermSize為64m
-client選項下默認MaxPermSize為32m
E. java.lang.OutOfMemoryError: PermGen space
內存溢出。
如果你的應用中有很多CLASS的話,就很可能出現PermGen space錯誤,
這種錯誤常見在web伺服器對JSP進行pre compile的時候。如果你的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 文檔重復佔用內存的目的。
F. Java內存設置詳解(含內存溢出問題的解決)
Java內存溢出問題詳解,主要涉及三種情況:Java heap space、PermGen space和Stack Overflow。
1. Java heap space溢出常見於JVM Heap(堆)空間不足,導致應用運行時出現「java.lang.OutOfMemoryError: Java heap space」異常。JVM在啟動時自動配置Heap的大小,初始空間為物理內存的1/64,最大空間不超過物理內存。可通過-Xms和-Xmx參數手動調整Heap大小。
Heap空間由Young Generation和Tenured Generation組成。若年輕代和老年代的總可用空間不足2%,且應用在98%的時間內需要進行垃圾回收,即拋出此異常。
解決方法:根據應用需求調整Heap大小。
2. PermGen space溢出則源於內存永久保存區域,主要用於存儲Class和Meta信息。Class在被載入時放入PermGen space,而JVM不執行主程序期間的垃圾回收,導致大量Class載入後內存空間不足。異常信息為「java.lang.OutOfMemoryError: PermGen space」。
解決方法:手動設置MaxPermSize參數調整PermGen空間大小。
3. Stack Overflow錯誤發生在函數調用深度過大,超過了棧區的容量。常見於遞歸調用過深或錯誤設計的代碼結構。
解決方法:優化代碼邏輯,減少不必要的遞歸調用。
為解決Java內存溢出問題,需要根據具體情況調整JVM參數。在Linux環境下調整Tomcat配置,包括修改`catalina.sh`文件或修改注冊表鍵值。Windows環境下的Tomcat服務需要通過注冊表或修改特定的`.exe`文件來調整配置。在MyEclipse中啟動Tomcat時,可在Java VM參數中添加特定選項來優化內存使用。
G. Javaheapspace問題,有解決心得嗎。先謝謝
標準的答案!在myeclipse中出現:java.lang.OutOfMemoryError:Javaheapspace或著java.lang.OutOfMemoryError:PermGenspace這兩個錯誤,原因是tomcat或著mycelispe沒有設置好如是單獨啟動tomcat出現這個問題,應該在如apache-tomcat-5.5.25\bin\catalina.bat文件中添加setCATALINA_OPTS=-Xms512m-Xmx1048m-XX:PermSize=128m-XX:MaxPermSize=400m根據自己機器的實際情況決定,默認MaxPermSize為128,這個地方設置的也不能太大的,如果太大的話,運行startup.bat將會一閃而過,啟動不了tomcat如果是在myeclipse中啟動出現這個問題,要是myeclipse中設置tomcat的啟動參數路徑:Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->下,-Xms1024M-Xmx1024M-XX:MaxPermSize=400M不設置就算tomcat中設置了,也還是按默認的128M運行,這里的設置也要根據自己的機器的實際情況來定。