linux下tomcat內(nèi)存溢出問題記錄

Tomcat本身不能直接在計(jì)算機(jī)上運(yùn)行,需要依賴于操作系統(tǒng)和一個(gè)JAVA虛擬機(jī)。JAVA程序啟動(dòng)時(shí)JVM會(huì)分配一個(gè)初始內(nèi)存和最大內(nèi)存給APP。當(dāng)APP需要的內(nèi)存超出內(nèi)存的最大值時(shí)虛擬機(jī)就會(huì)提示內(nèi)存溢出,并且導(dǎo)致應(yīng)用服務(wù)崩潰。

一、常見的Java內(nèi)存溢出有以下三種:

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

解釋說明:JVM在啟動(dòng)的時(shí)候會(huì)自動(dòng)設(shè)置JVM Heap的值,JVM堆的設(shè)置是指java程序運(yùn)行過程中JVM可以調(diào)配使用的內(nèi)存空間的設(shè)置。其初始空間默認(rèn)是物理內(nèi)存的1/64,最大空間不可超過物理內(nèi)存。JVM提供-Xmn -Xms -Xmx等選項(xiàng)來進(jìn)行設(shè)置。

出錯(cuò)場(chǎng)景:在JVM中,如果98%的時(shí)間是用于GC,且可用的Heap size不足2%時(shí),將會(huì)出現(xiàn)JVM Heap溢出

解決方法:修改JVM Heap的大小。

2. java.lang.OutOfMemoryError: PermGen space? ? ? ? 即PermGen space溢出。(我出現(xiàn)的是這種情況,在conf目錄下的catalina.sh加了一句代碼解決了)

解釋說明:PermGen space是指內(nèi)存的永久保存區(qū)域。這個(gè)區(qū)域主要存放Class和Meta信息,Class在被Load時(shí)就會(huì)被放入PermGen space。

出錯(cuò)場(chǎng)景:如果APP載入很多CLASS,就可能會(huì)出現(xiàn)PermGen space溢出。(因?yàn)閟un的GC不會(huì)在程序運(yùn)行時(shí)對(duì)PermGen space進(jìn)行清理)。常見在web服務(wù)器對(duì)JSP進(jìn)行pre compile的時(shí)候

解決方法:修改MaxPermSize大小

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

解釋說明:JVM采用的是棧式的虛擬機(jī),函數(shù)的調(diào)用過程都體現(xiàn)在堆棧和退棧上。

出錯(cuò)場(chǎng)景:通常棧的大小是1-2MB的,如果調(diào)用構(gòu)造函數(shù)的 “層”太多,則會(huì)出現(xiàn)棧溢出

解決方法:修改程序

二、Tomcat的JVM內(nèi)存溢出解決方法

在生產(chǎn)環(huán)境中,tomcat內(nèi)存設(shè)置不好很容易出現(xiàn)JVM內(nèi)存溢,解決方法就是修改Tomcat中的catalina.sh文件。

在catalina.sh文件中,找到cygwin=false,在這一行的前面加入?yún)?shù),具體如下

# vi TOMCAT_HOME/conf/catalina.sh

JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容