1. 程式人生 > >linux解決Tomcat記憶體溢位

linux解決Tomcat記憶體溢位

Tomcat本身不能直接在計算機上執行,需要依賴於作業系統和一個JAVA虛擬機器。JAVA程式啟動時JVM會分配一個初始記憶體和最大記憶體給程式。當程式需要的記憶體超出記憶體的最大值時虛擬機器就會提示記憶體溢位,並且導致應用服務崩潰。

一、常見的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)
--------------------- 
作者:njchenyi 
來源:CSDN 
原文:https://blog.csdn.net/njchenyi/article/details/45772289 
版權宣告:本文為博主原創文章,轉載請附上博文連結!