linux/centos 解決Tomcat內存溢出,centostomcat

linux/centos 解決Tomcat內存溢出,centostomcat


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


1、常見的Java內存溢出有如下三種:java

1. java.lang.OutOfMemoryError: Java heap space      即JVM Heap溢出linux

 

解釋說明: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溢出web

 

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


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


 windows

3. java.lang.StackOverflowError                                  即棧溢出centos

 

解釋說明:JVM採用的是棧式的虛擬機,函數的調用過程都體如今堆棧和退棧上。

出錯場景:一般棧的大小是1-2MB的,若是調用構造函數的 「層」太多,則會出現棧溢出

解決方法:修改程序



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

在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%分配給新生成的池
 less

 

3、jvm參數說明:
-server                                          必定要做爲第一個參數,啓用JDK的server版本,在多個CPU時性能佳 
-Xms                                             java Heap初始大小。 默認是物理內存的1/64。
-Xmx                                             java heap最大值。建議均設爲物理內存的80%。不可超過物理內存。
-Xmn                                             java heap最小值,通常設置爲Xmx的三、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) jvm

TOMCAT 內存溢出錯誤

先試試這個:
-Xms64m 
-Xmx256m 
-XX:PermSize=128M 
-XX:MaxNewSize=256m 
-XX:MaxPermSize=256m 

下面是找了2篇文章

答案1
設置Tomcat啓動的初始內存
其初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。能夠利用JVM提供的-Xmn -Xms -Xmx等選項可
進行設置
3、實例,如下給出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服務,設置生效 

答案2
Tomcat 的JVM 內存溢出問題的解決
關鍵字: tomcat 的jvm 內存溢出問題的解......餘下全文>>
 

tomcat提示內存溢出,怎解決

Perm區溢出了,多是你的SSH包加了以後默認啓動加載的東西多了致使的。 java虛擬機對非堆區內存配置的兩個參數: 一、-XX:PermSize:表示非堆區初始內存分配大小,其縮寫爲permanent size(持久化內存) 二、-XX:MaxPermSize:表示對非堆區分配的內存的最大上限。 配置這兩個啓動參數試試

相關文章
相關標籤/搜索