Tomcat的jvm配置
Tomcat本身不能直接在計算機上執行,需要依賴於作業系統和一個JAVA虛擬機器。Tomcat的記憶體溢位本質就是JVM記憶體溢位,JAVA程式啟動時JVM會分配一個初始記憶體和最大記憶體給程式。當程式需要的記憶體超出記憶體的最大值時虛擬機器就會提示記憶體溢位,並且導致應用服務崩潰。
1.Tomcat異常型別
常見的Java記憶體溢位有以下三種:
- 1. Java.lang.OutOfMemoryError:java heap space 堆溢位。
解釋說明:JVM在啟動的時候會自動設定JVM Heap(java堆)的值,JVM堆的設定是指java程式執行過程中JVM可以調配使用的記憶體空間的設定。其初始空間預設是實體記憶體的1/64,最大空間不可超過實體記憶體的1/4(Tomcat預設可以使用的記憶體為128MB)。JVM提供-Xmn -Xms -Xmx等選項來進行相關設定。
出錯場景:在JVM中,如果98%的時間是用於GC,且可用的Heap size不足2%時,將會出現JVM Heap溢位
解決方法:修改JVM Heap的大小。
- 2. java.lang.OutOfMemoryError:PermGen space 非堆溢位
解釋說明:PermGen space是指記憶體的永久儲存區域。這個區域主要存放Class和Meta資訊,Class在被Loader時就會被放入PermGen space。
出錯場景:常見於web伺服器對JSP進行pre compile的時候, 如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm預設的大小(4M)那麼就會產生此錯誤資訊了。
解決方法:修改MaxPermSize大小。建議將相同的第三方jar檔案移置到tomcat/shared/lib目錄下,這樣可以減少jar 文件重複佔用記憶體
- 3. java.lang.OutOfMemoryError:unable to create new native thread.無法建立新的執行緒(較少見)
解釋說明:這種現象比較少見,主要與JVM佔用系統記憶體的比例有關,如果JVM佔用的系統記憶體太大,導致建立執行緒所需要的實體記憶體有限。執行緒的大小是一定的,從而導致執行緒的數量受到限制。
解決方法:結合作業系統進行相關調整,結合不同情況對tomcat記憶體進行分配。
2.具體解決方法
前兩種記憶體溢位通過設定tomcat的JVM配置進行解決。具體如下:
Linux(以1G記憶體為例):在%tomcat安裝路徑%/bin/catalina.sh檔案中加入如下語句:
JAVA_OPTS='-server -Xms800m -Xmx800m -XX:PermSize=128m -XX:MaxPermSize=128m'
其中:“m”說明單位是MB,否則預設是KB。
設定完後,需重新啟動tomcat才生效。
1 java heap(java堆)設定
-Xms :Xms java Heap初始大小。 預設是實體記憶體的1/64;
-Xmx :java heap最大值。不超過實體記憶體的80%;
-Xmn :java heap最小值,一般設定為Xmx的4分之一;
備註:一般的要將-Xms和-Xmx選項設定為相同。
32位作業系統下JVM記憶體不超過2GB
2 PermGen space(永久儲存區域)設定
-XX:PermSize:設定記憶體的永久儲存區域;
-XX:MaxPermSize:設定最大記憶體的永久儲存區域;
備註:-XX:MaxPermSize與-Xmx的總和不超過實體記憶體。
3 JVM其他引數:
-server/-client: 兩個引數用於設定虛擬機器使用何種執行模式,放在第一個
在windows上,預設的虛擬機器型別為client模式,client模式啟動比較快,但執行時效能和記憶體管理效率不如server模式,通常用於客戶端應用程式。
在Linux,Solaris上預設採用server模式。server模式啟動比client慢,但可獲得更高的執行效能。對伺服器端應用,推薦採用server模式,尤其是多個CPU的系統。
-XX:NewSize 新生成的池的初始大小,預設值為2M。
-XX:MaxNewSize 新生成的池的最大大小,預設值為32M。
-verbose:gc 現實垃圾收集資訊。
-Xloggc:gc.log 指定垃圾收集日誌檔案。
-XX:+UseParNewGC 縮短minor收集的時間。
-XX:+UseConcMarkSweepGC 縮短major收集的時間。
-XX:userParNewGC 可用來設定並行收集(多CPU)。
-XX:ParallelGCThreads 可用來增加並行度(多CPU)。
-XX:UseParallelGC 設定後可以使用並行清除收集器(多CPU)。
備註:查詢Tomcat的JVM記憶體方法:
在%tomcat安裝路徑%/conf/tomcat-users.xml中新增如下語句:
開啟tomcat後 訪問port/manager/status並輸入使用者密碼(port為自己定義的ip以及埠號)即可檢視JVM引數值。