1、Eclise 中設置jvm內(nèi)存: 修改eclipse的配置文件,對所有工程都起作用
修改eclipse根目錄下的eclipse.ini文件
-vmargs //虛擬機設置
-Xms40m //初始內(nèi)存
-Xmx256m //最大內(nèi)存
-Xmn16m //最小內(nèi)存
-XX:PermSize=128M //非堆內(nèi)存
-XX:MaxPermSize=256M
2、Eclise 中設置jvm內(nèi)存:jres VM Arguments參數(shù)的設置,對所有工程都起作用
打開eclipse window-preferences-Java-Installed JREs -Edit-Default VM Arguments
在VM自變量中輸入:-Xmx128m -Xms64m -Xmn32m -Xss16m
3、Eclise 中設置jvm內(nèi)存:RunConfigurations VM arguments參數(shù)設置,只對這個工程起作用
在Eclipse中-->右擊工程/要運行的主類-->Run As-->RunConfigurations-->(x)=Arguments-->VM arguments
中加入 -Xmx36m
4、Eclise 中設置jvm內(nèi)存:Debug Configurations VM arguments參數(shù)設置,只對這個工程起作用
在Eclipse中-->右擊工程/要運行的主類-->Debug As-->DebugConfigurations-->(x)=Arguments-->VM arguments
中加入-Xmx36m
5、Tomcat內(nèi)存設置
windows下在catalina.bat的第一行增加:
Java代碼 :set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
Linux下在catalina.sh的第一行增加:
Java代碼 :JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
實例+詳解
設置Tomcat啟動的初始內(nèi)存其初始空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4。
可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設置
實例,以下給出1G內(nèi)存環(huán)境下Java jvm 的參數(shù)設置參考:
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"
在/usr/local/apache-tomcat-5.5.23/bin 目錄下的catalina.sh添加:
JAVA_OPTS='-Xms512m -Xmx1024m'要加“m”說明是MB,否則就是KB了,在啟動tomcat時會 報內(nèi)存不足。
-Xms:初始值-Xmx:最大值-Xmn:最小值
Windows:
在catalina.bat最前面加入set JAVA_OPTS=-Xms128m -Xmx350m
如果用startup.bat啟動tomcat,OK設置生效.夠成功的分配200M內(nèi)存.
但是如果不是執(zhí)行startup.bat啟動tomcat而是利用windows的系統(tǒng)服務啟動tomcat服務,上面的設置就不生效了,就是說set JAVA_OPTS=-Xms128m -Xmx350m 沒起作用.上面分配200M內(nèi)存就OOM了..
windows服務執(zhí)行的是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服務,設置生效
Tomcat 的JVM 內(nèi)存溢出問題的解決關鍵字: tomcat 的jvm 內(nèi)存溢出問題的解決
最近在熟悉一個開發(fā)了有幾年的項目,需要把數(shù)據(jù)庫從MySQL移植到Oracle,首先把jdbc的連接指向mysql,打包放到tomcat里面,可以跑起來,沒有問題,可是當把jdbc連接指向oracle的時候,tomcat就連續(xù)拋java.lang.OutOfMemoryError的錯誤,上網(wǎng)google了一下,了解了一下tomcat的運行機制,也解決了問題,share出來,以備查。
1、首先是:java.lang.OutOfMemoryError: java heap space 解釋:
Heap size 設置 JVM堆的設置是指java程序運行過程中JVM可以調(diào)配使用的內(nèi)存空間的設置.JVM在啟動的時候會自動設置Heap size的值,其初始空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4??梢岳肑VM提供的-Xmn -Xms -Xmx等選項可進行設置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的時間是用于GC且可用的Heap size 不足2%的時候?qū)伋龃水惓P畔ⅰ?nbsp;
提示:Heap Size 最大不要超過可用物理內(nèi)存的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
或修改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,是指內(nèi)存的永久保存區(qū)域,這塊內(nèi)存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGen space中,它和存放類實例(Instance)的Heap區(qū)域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的應用中有很CLASS的話,就很可能出現(xiàn)PermGen space錯誤,這種錯誤常見在web服務器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那么就會產(chǎn)生此錯誤信息了。
解決方法:
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
catalina.sh下為: Java代碼 JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"
下面給出各種可以用戶設置堆大小的命令行參數(shù)。注釋列提供了一些設置參數(shù)的初級或高級建議。此外,后面還會給出更多的詳細建議。
參數(shù) | 描述 | 注釋 |
-Xms<size> | 設置堆的最小值 | 在生產(chǎn)階段,最小和最大堆值設置為相同的值 |
-Xmx<size> | 設置堆的最大值 | |
-XX:NewSize=<size> | 設置年輕代的最小值 | 在生產(chǎn)階段,最小和最大年輕代的值設為相同的值 |
-XX:MaxNewSize=<size> | 設置年輕代的最大值 | |
-XX:NewRatio=<number> | 設置年輕代和年老代的大小比例。例如,數(shù)值為2時 年老代將會是年輕代大小的2倍。 | 使用NewSize/MaxNewSize參數(shù)或NewRatio參數(shù),但不要兩個參數(shù)都使用 |
-XX:SurvivorRatio=<number> | 設置eden space和剩余空間的大小比例。例如,剩余空間比例為8時,eden space是任一剩余空間大小的8倍。 | 基于年輕代大小改變比例。比例值為8適用于 小的年輕代(如10M),32適用于比較大的年輕代(如100M)。 |
-XX:MaxTenuringThreshold=<number> | 表示一個對象在被自動放置于年老代之前必須存活的次要回收的次數(shù) | 一般應該使用的值為32 |
-XX:MaxPermSizse=<size> | 設置永久代的大小 | 在用完空間后在設置永久代 |
-XX:+UserTLAB | 在eden space里給應用程序的每一個線程提供它自己的分配區(qū)域(線程本地分配塊TLAB)。注意它是一個布爾型選項, 用plus(+)可以啟動它,用minus(-)(-XX:-UseTLAB)可以禁用它 | 主要對多處理器系統(tǒng)有利 |
-XX:TLABSize=<size> | 每一個TLAB的大小 | 確保年輕代空間足夠為應用程序里的每一個線程保存所有的TLAB。應該分別使用64KB、128KB和256KB進行嘗試 |
注意:1.<size>是一個表示字節(jié)數(shù)量的浮點數(shù),在其后面加上K、M、G后綴分別代表KB、MB、GB。
2.<number>是一個浮點數(shù)。
[Full GC 121376K->10414K(130112K), 0.0650971 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
四、調(diào)優(yōu)總結(jié)
1.在eclipse設置JVM參數(shù)
打開eclipse-窗口-首選項-Java-已安裝的JRE(對在當前開發(fā)環(huán)境中運行的java程序皆生效,也就是在eclipse中運行的java程序)編輯當前使用的JRE,在缺省VM參數(shù)中輸入:
-Xmx1024m -Xms1024m -Xmn256m -Xss16m
或者在運行一個java程序的時候執(zhí)行:
java -Xmx1024m -Xms1024m -Xmn256m -Xss16m Test
Test是一個class文件。
2. 在Tomcat服務器上設置JVM參數(shù)
set CATALINA_OPTS=-Xmx512m -Xms512m -Xmn64m -Xss2m 或者
set JAVA_OPTS=-Xmx512m -Xms512m -Xmn64m -Xss2m
設置CATALINA_OPTS 和 JAVA_OPTS都是一個道理,在啟動tomcat的時候設置參數(shù)。
兩者區(qū)別是JAVA_OPTS在tomcat停止的時候也會執(zhí)行這個命令。
注意:Tomcat分為安裝版(*.exe)和非安裝版或者解壓版(*.zip),個人還是比較喜歡解壓版。兩者雖然在功能上沒有什么區(qū)別,但是在設置上還是有要注意的地方。這里只談JVM設置要注意的地方。
安裝版:windows的服務會有一個tomcat服務,當啟動服務的時候Tomcat會從注冊表讀取JVM的參數(shù)。也就是說當在tomcat的lib文件夾下catalina.bat或者startup.bat中設置JVM參數(shù)是無效的。解決辦法:設置tomcat的注冊表;或者使用startup.bat啟動tomcat。
解壓版:當點擊startup.bat時,它會讀取catalina.bat中的配置,不管在startup.bat文件還是在catalina.bat文件中設置JVM參數(shù),都會讀取JVM參數(shù)。
3. 查看堆的大小
在程序中查看,返回值單位是字節(jié),當然還有其他JVM參數(shù)可以查看。
Runtime.getRuntime().maxMemory();
或者在命令行 執(zhí)行jvisualvm 命令
或者%java_home%\bin 目錄下點擊jvisualvm.exe
或者在命令行執(zhí)行jconsole 命令
或者%java_home%\bin 目錄下點擊jconsole.exe
4. java內(nèi)存可以分為堆內(nèi)存和非堆內(nèi)存
堆和非堆:堆是給開發(fā)人員用的,是在JVM啟動時創(chuàng)建; 非堆是留給JVM自己用的,用來存放類型(類和接口)的信息。它和堆不同,運行期內(nèi)GC不會釋放空間。如果web app用了大量的第三方jar或者應用有太多的class文件而恰好MaxPermSize設置較小,超出了也會導致這塊內(nèi)存的占用過多造成溢出,或者 tomcat熱部署時侯不會清理前面加載的環(huán)境,只會將context更改為新部署的,非堆存的內(nèi)容就會越來越多,熱部署上幾次就java.lang.OutOfMemoryError: PermGen space .
---- 堆內(nèi)存設置:程序可以到達的,可以操作的
-Xms 初始堆內(nèi)存 默認物理內(nèi)存1/64,也是最小分配堆內(nèi)存。當空余堆內(nèi)存小于40%時,會增加到-Xms的最大限制
-Xmx 最大堆內(nèi)存分配 默認物理內(nèi)存1/4,當空余堆內(nèi)存大于70%時,會減小到-Xms的最小限制。
一般設置 -Xms和Xms大小相等
---- 非堆內(nèi)存設置
-XX:PermSize 非堆內(nèi)存的初始值,默認物理內(nèi)存的1/64 ,也是最小非堆內(nèi)存。
-XX:MaxPermSize 非堆內(nèi)存最大值,默認物理內(nèi)存的1/4,
5. 典型JVM參數(shù)設置:
java -Xmx128m -Xms128m -Xmn64m -Xss1m
-Xmx128m:設置JVM最大可用內(nèi)存為128M。
-Xms128m:設置JVM最小內(nèi)存為128m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。
-Xmn2g:設置年輕代大小為2G。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小。此值對系統(tǒng)性能影響較大,Sun官方推薦配置為整個堆的3/8。
-Xss128k:設置每個線程的堆棧大小。 JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。根據(jù)應用的線程所需內(nèi)存大小進行調(diào)整。在相同物理內(nèi)存下,減小這個值能生成更 多的線程。但是操作系統(tǒng)對一個進程內(nèi)的線程數(shù)還是有限制的,不能無限生成,經(jīng)驗值在3000~5000左右。
-- Ratio 英音:['reiseu] 比率
-- Eden 伊甸
-- Survivor 幸存者
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區(qū))與年老代的比值(除去持久代)。設置為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5
-XX:SurvivorRatio=4:設置年輕代中Eden區(qū)與Survivor區(qū)的大小比值。設置為4,則兩個Survivor區(qū)與一個Eden區(qū)的比值為2:4,一個Survivor區(qū)占整個年輕代的1/6
-XX:MaxPermSize=16m:設置持久代大小為16m。
-XX:MaxTenuringThreshold=0:設置垃圾最大年齡。如果設置為0的話,則年輕代對象不經(jīng)過Survivor區(qū),直接進入年老代。
對于年老代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則年輕代對象會在Survivor區(qū)進行多次復制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。