Linux下 Tomcat內存溢出

        Tomcat本身不能直接在計算機上運行,需要依賴於操作系統和一個JAVA虛擬機。JAVA程序啓動時JVM會分配一個初始內存和最大內存給APP。當APP需要的內存超出內存的最大值時虛擬機就會提示內存溢出,並且導致應用服務崩潰。

一、常見的Java內存溢出有以下三種:
1. java.lang.OutOfMemoryError: Java heap space      即JVM Heap溢出
解釋說明:JVM在啓動的時候會自動設置JVM Heap的值,JVM堆的設置是指java程序運行過程中JVM可以調配使用的內存空間的設置。其初始空間默認是物理內存的1/64,最大空間不可超過物理內存。JVM提供-Xmn -Xms -Xmx等選項來進行設置。

出錯場景:在JVM中,如果98%的時間是用於GC,且可用的Heap size不足2%時,將會出現JVM Heap溢出
解決方法:修改JVM Heap的大小。
          

2. java.lang.OutOfMemoryError: PermGen space        即PermGen space溢出。 
解釋說明:PermGen space是指內存的永久保存區域。這個區域主要存放Class和Meta信息,Class在被Load時就會被放入PermGen space。

出錯場景:如果APP載入很多CLASS,就可能會出現PermGen space溢出。(因爲sun的GC不會在程序運行時對PermGen space進行清理)。常見在web服務器對JSP進行pre compile的時候  
解決方法:修改MaxPermSize大小


3. java.lang.StackOverflowError                     即棧溢出
解釋說明:JVM採用的是棧式的虛擬機,函數的調用過程都體現在堆棧和退棧上。

出錯場景:通常棧的大小是1-2MB的,如果調用構造函數的 “層”太多,則會出現棧溢出
解決方法:修改程序


二、Tomcat的JVM內存溢出解決方法
在生產環境中,tomcat內存設置不好很容易出現JVM內存溢,解決方法就是修改Tomcat中的catalina.sh文件。

在catalina.sh文件中,找到cygwin=false,在這一行的前面加入參數,具體如下
# vi TOMCAT_HOME/bin/catalina.sh
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m" 



其他說明:
1.“m”說明單位是MB,否則默認是KB
2.一般使用物理內存的80%作爲堆大小
3.一般把-Xms和-Xmx設爲一樣大
4.一般把-Xmn設置爲-Xmx值的1/4
5.一般將堆的總大小的50%到60%分配給新生成的池


三、jvm參數說明:
-server                 一定要作爲第一個參數,啓用JDK的server版本,在多個CPU時性能佳 
-Xms                    java Heap初始大小。 默認是物理內存的1/64。
-Xmx                    java heap最大值。建議均設爲物理內存的80%。不可超過物理內存。
-Xmn                    java heap最小值,一般設置爲Xmx的3、4分之一。
-XX:PermSize            設定內存的永久保存區初始大小,缺省值爲64M。
-XX:MaxPermSize         設定內存的永久保存區最大大小,缺省值爲64M。
-XX:SurvivorRatio=2     生還者池的大小,默認是2。如果垃圾回收變成了瓶頸,您可以嘗試定製生成池設置
-XX:NewSize             新生成的池的初始大小。 缺省值爲2M。
-XX:MaxNewSize          新生成的池的最大大小。 缺省值爲32M。
+XX:AggressiveHeap      讓jvm忽略Xmx參數,瘋狂地吃完一個G物理內存,再吃盡一個G的swap。 
-Xss                    每個線程的Stack大小
-verbose:gc             現實垃圾收集信息
-Xloggc:gc.log          指定垃圾收集日誌文件
-XX:+UseParNewGC        縮短minor收集的時間
-XX:+UseConcMarkSweepGC 縮短major收集的時間
-XX:userParNewGC        可用來設置並行收集(多CPU)
-XX:ParallelGCThreads   可用來增加並行度(多CPU)
-XX:UseParallelGC       設置後可以使用並行清除收集器(多CPU)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章