Tomcat內(nèi)存溢出分析及解決方法
第1篇:Tomcat內(nèi)存溢出分析及解決方法
jvm管理兩種類型的內(nèi)存,堆和非堆。堆是給開發(fā)人員用的上面說的就是,是在jvm啟動時創(chuàng)建;非堆是留給jvm自己用的,用來存放類的信息的。它和堆不同,運(yùn)行期內(nèi)gc不會釋放空間。
一、內(nèi)存溢出類型
1、java.lang.outofmemoryerror:permgenspace
jvm管理兩種類型的內(nèi)存,堆和非堆。堆是給開發(fā)人員用的上面說的就是,是在jvm啟動時創(chuàng)建;非堆是留給jvm自己用的,用來存放類的信息的。它和堆不同,運(yùn)行期內(nèi)gc不會釋放空間。如果webapp用了大量的第三方j(luò)ar或者應(yīng)用有太多的class文件而恰好maxpermsize設(shè)置較小,超出了也會導(dǎo)致這塊內(nèi)存的占用過多造成溢出,或者tomcat熱部署時侯不會清理前面加載的環(huán)境,只會將context更改為新部署的,非堆存的內(nèi)容就會越來越多。
permgenspace的全稱是permanentgenerationspace,是指內(nèi)存的永久保存區(qū)域,這塊內(nèi)存主要是被jvm存放class和meta信息的,class在被loader時就會被放到permgenspace中,它和存放類實例(instance)的heap區(qū)域不同,gc(garbagecollection)不會在主程序運(yùn)行期對permgenspace進(jìn)行清理,所以如果你的應(yīng)用中有很class的話,就很可能出現(xiàn)permgenspace錯誤,這種錯誤常見在web服務(wù)器對jsp進(jìn)行prepile的時候。如果你的webapp下都用了大量的第三方j(luò)ar,其大小超過了jvm默認(rèn)的大小(4m)那么就會產(chǎn)生此錯誤信息了。
一個最佳的配置例子:(經(jīng)過本人驗*,自從用此配置之后,再未出現(xiàn)過tomcat死掉的情況)
setjava_opts=-xms800m-xmx800m-xx:permsize=128m-xx:maxnewsize=256m-xx:maxpermsize=256m
在linux下在tomcathome/conf/catalina.sh中加上如標(biāo)紅所示的一句代碼:可以增加tomcatjvm的內(nèi)存,這樣就不容易出現(xiàn)內(nèi)存溢出的現(xiàn)象了!
#-----executetherequestedmand-----------------------------------------
java_opts="-server-xms512m-xmx2048m-xx:permsize=128m-xx:maxnewsize=256m-xx:maxpermsize=256m"
#bugzilla37848:onlyoutputthisifwehaveatty
2、java.lang.outofmemoryerror:javaheapspace
第一種情況是個補(bǔ)充,主要存在問題就是出現(xiàn)在這個情況中。其默認(rèn)空間(即-xms)是物理內(nèi)存的1/64,最大空間(-xmx)是物理內(nèi)存的1/4。如果內(nèi)存剩余不到40%,jvm就會增大堆到xmx設(shè)置的值,內(nèi)存剩余超過70%,jvm就會減小堆到xms設(shè)置的值。所以服務(wù)器的xmx和xms設(shè)置一般應(yīng)該設(shè)置相同避免每次gc后都要調(diào)整虛擬機(jī)堆的大小。假設(shè)物理內(nèi)存無限大,那么jvm內(nèi)存的最大值跟*作系統(tǒng)有關(guān),一般32位機(jī)是1.5g到3g之間,而64位的就不會有限制了。
注意:如果xms超過了xmx值,或者堆最大值和非堆最大值的總和超過了物理內(nèi)存或者*作系統(tǒng)的最大限制都會引起服務(wù)器啟動不起來。
垃圾回收gc的角*
jvm調(diào)用gc的頻度還是很高的,主要兩種情況下進(jìn)行垃圾回收:
當(dāng)應(yīng)用程序線程空閑;另一個是java內(nèi)存堆不足時,會不斷調(diào)用gc,若連續(xù)回收都解決不了內(nèi)存堆不足的問題時,就會報outofmemory錯誤。因為這個異常根據(jù)系統(tǒng)運(yùn)行環(huán)境決定,所以無法預(yù)期它何時出現(xiàn)。
根據(jù)gc的機(jī)制,程序的運(yùn)行會引起系統(tǒng)運(yùn)行環(huán)境的變化,增加gc的觸發(fā)機(jī)會。
為了避免這些問題,程序的設(shè)計和編寫就應(yīng)避免垃圾對象的內(nèi)存占用和gc的開銷。顯示調(diào)用system.gc()只能建議jvm需要在內(nèi)存中對垃圾對象進(jìn)行回收,但不是必須馬上回收,
一個是并不能解決內(nèi)存資源耗空的局面,另外也會增加gc的消耗。
二、jvm內(nèi)存區(qū)域組成
簡單的說java中的堆和棧
java把內(nèi)存分兩種:一種是棧內(nèi)存,另一種是堆內(nèi)存
1、在函數(shù)中定義的基本類型變量和對象的引用變量都在函數(shù)的棧內(nèi)存中分配;
2、堆內(nèi)存用來存放由new創(chuàng)建的對象和數(shù)組
在函數(shù)(代碼塊)中定義一個變量時,java就在棧中為這個變量分配內(nèi)存空間,當(dāng)超過變量的作用域后,java會自動釋放掉為該變量所分配的內(nèi)存空間;在堆中分配的內(nèi)存由java虛擬機(jī)的自動垃圾回收器來管理
堆的優(yōu)勢是可以動態(tài)分配內(nèi)存大小,生存期也不必事先告訴編譯器,因為它是在運(yùn)行時動態(tài)分配內(nèi)存的。缺點(diǎn)就是要在運(yùn)行時動態(tài)分配內(nèi)存,存取速度較慢;
棧的優(yōu)勢是存取速度比堆要快,缺點(diǎn)是存在棧中的數(shù)據(jù)大小與生存期必須是確定的無靈活*。
java堆分為三個區(qū):new、old和permanent
gc有兩個線程:
新創(chuàng)建的對象被分配到new區(qū),當(dāng)該區(qū)被填滿時會被gc輔助線程移到old區(qū),當(dāng)old區(qū)也填滿了會觸發(fā)gc主線程遍歷堆內(nèi)存里的所有對象。old區(qū)的大小等于xmx減去-xmn
java棧存放
棧調(diào)整:參數(shù)有+usedefaultstacksize-xss256k,表示每個線程可申請256k的?臻g
每個線程都有他自己的stack
三、jvm如何設(shè)置虛擬內(nèi)存
提示:在jvm中如果98%的時間是用于gc且可用的heapsize不足2%的時候?qū)伋龃水惓P畔ⅰ?/p>
提示:heapsize最大不要超過可用物理內(nèi)存的80%,一般的要將-xms和-xmx選項設(shè)置為相同,而-xmn為1/4的-xmx值。
提示:jvm初始分配的內(nèi)存由-xms指定,默認(rèn)是物理內(nèi)存的1/64;jvm最大分配的內(nèi)存由-xmx指定,默認(rèn)是物理內(nèi)存的1/4。
默認(rèn)空余堆內(nèi)存小于40%時,jvm就會增大堆直到-xmx的最大限制;空余堆內(nèi)存大于70%時,jvm會減少堆直到-xms的最小限制。因此服務(wù)器一般設(shè)置-xms、-xmx相等以避免在每次gc后調(diào)整堆的大小。
提示:假設(shè)物理內(nèi)存無限大的話,jvm內(nèi)存的最大值跟*作系統(tǒng)有很大的關(guān)系。
簡單的說就32位處理器雖然可控內(nèi)存空間有4gb,但是具體的*作系統(tǒng)會給一個限制,
這個限制一般是2gb-3gb(一般來說windows系統(tǒng)下為1.5g-2g,linux系統(tǒng)下為2g-3g),而64bit以上的處理器就不會有限制了
注意:如果xms超過了xmx值,或者堆最大值和非堆最大值的總和超過了物理內(nèi)存或者*作系統(tǒng)的最大限制都會引起服務(wù)器啟動不起來。
提示:設(shè)置newsize、maxnewsize相等,"new"的大小最好不要大于"old"的一半,原因是old區(qū)如果不夠大會頻繁的觸發(fā)"主"gc,大大降低了*能
jvm使用-xx:permsize設(shè)置非堆內(nèi)存初始值,默認(rèn)是物理內(nèi)存的1/64;
由xx:maxpermsize設(shè)置最大非堆內(nèi)存的大小,默認(rèn)是物理內(nèi)存的1/4。
解決方法:手動設(shè)置heapsize
修改tomcat_home/bin/catalina.bat
在“echo"usingcatalina_base:$catalina_base"”上面加入以下行:
java_opts="-server-xms800m-xmx800m-xx:maxnewsize=256m"
第2篇:內(nèi)存溢出的原因及解決方法
引起內(nèi)存溢出的原因
1.內(nèi)存中加載的數(shù)據(jù)量過于龐大,如一次從數(shù)據(jù)庫取出過多數(shù)據(jù);
2.*類中有對對象的引用,使用完后未清空,使得jvm不能回收;
3.代碼中存在死循環(huán)或循環(huán)產(chǎn)生過多重復(fù)的對象實體;
4.使用的第三方軟件中的bug;
5.啟動參數(shù)內(nèi)存值設(shè)定的過小
內(nèi)存溢出的解決方案:
第一步,修改jvm啟動參數(shù),直接增加內(nèi)存。(-xms,-xmx參數(shù)一定不要忘記加。)
第二步,檢查錯誤日志,查看“outofmemory”錯誤前是否有其它異;蝈e誤。
第三步,對代碼進(jìn)行走查和分析,找出可能發(fā)生內(nèi)存溢出的位置。
重點(diǎn)排查以下幾點(diǎn):
1.檢查對數(shù)據(jù)庫查詢中,是否有一次獲得全部數(shù)據(jù)的查詢。一般來說,如果一次取十萬條記錄到內(nèi)存,就可能引起內(nèi)存溢出。這個問題比較隱蔽,在上線前,數(shù)據(jù)庫中數(shù)據(jù)較少,不容易出問題,上線后,數(shù)據(jù)庫中數(shù)據(jù)多了,一次查詢就有可能引起內(nèi)存溢出。因此對于數(shù)據(jù)庫查詢盡量采用分頁的方式查詢。
2.檢查代碼中是否有死循環(huán)或遞歸調(diào)用。
3.檢查是否有大循環(huán)重復(fù)產(chǎn)生新對象實體。
4.檢查對數(shù)據(jù)庫查詢中,是否有一次獲得全部數(shù)據(jù)的查詢。一般來說,如果一次取十萬條記錄到內(nèi)存,就可能引起內(nèi)存溢出。這個問題比較隱蔽,在上線前,數(shù)據(jù)庫中數(shù)據(jù)較少,不容易出問題,上線后,數(shù)據(jù)庫中數(shù)據(jù)多了,一次查詢就有可能引起內(nèi)存溢出。因此對于數(shù)據(jù)庫查詢盡量采用分頁的方式查詢。
5.檢查list、map等*對象是否有使用完后,未清除的問題。list、map等*對象會始終存有對對象的引用,使得這些對象不能被gc回收。
第四步,使用內(nèi)存查看工具動態(tài)查看內(nèi)存使用情況
第3篇:Windows內(nèi)存出錯的解決方法
計算機(jī)系統(tǒng)中運(yùn)行一些容量較大的程序或者游戲時,系統(tǒng)常常會自動*出“xx內(nèi)存不能為read或written”的錯誤提示,遇到這種故障信息時,我們該如何才能將它有效排除,下面是小編為大家整理的windows內(nèi)存出錯的解決方法,歡迎參考~
移除無效*件程序
在上網(wǎng)沖浪的過程中,許多*件程序會偷偷地安裝到計算機(jī)系統(tǒng)中,而不少*件程序往往都有防刪除的功能,因此這些*件很容易與其他的應(yīng)用程序發(fā)生沖突,從而間接地引起系統(tǒng)內(nèi)存讀寫錯誤的現(xiàn)象。為了給那些大容量的應(yīng)用程序或游戲提供一個干凈、穩(wěn)定的工作環(huán)境,我們最好定期使用安全防護(hù)軟件,來查看系統(tǒng)是否被偷偷安裝了各種無效的垃圾*件程序,一旦發(fā)現(xiàn)的話,那可以直接將它們從系統(tǒng)中及時卸載干凈。
手工修復(fù)系統(tǒng)服務(wù)
與系統(tǒng)內(nèi)存讀寫*作有關(guān)的windowsmanagementinstrumentation服務(wù)要是發(fā)生錯誤的話,也會導(dǎo)致系統(tǒng)*出內(nèi)存讀寫錯誤的提示,所以當(dāng)我們遇到這種錯誤現(xiàn)象時,可以嘗試手工修復(fù)一下windowsmanagementinstrumentation服務(wù),下面就是具體的修復(fù)步驟:
首先,用鼠標(biāo)右鍵單擊系統(tǒng)桌面中的“我的電腦”圖標(biāo),從*出的快捷菜單中執(zhí)行“管理”命令,打開本地系統(tǒng)的計算機(jī)管理窗口,在該窗口的左側(cè)顯示區(qū)域,依次展開“服務(wù)和應(yīng)用程序”/“服務(wù)”選項,在對應(yīng)“服務(wù)”選項所在的右側(cè)顯示區(qū)域中,找到windowsmanagementinstrumentation服務(wù),并用鼠標(biāo)右鍵單擊該服務(wù)選項,從*出的快捷菜單中執(zhí)行“屬*”命令,打開服務(wù)屬*設(shè)置界面;
其次在該設(shè)置界面的“常規(guī)”標(biāo)簽頁面中,單擊“停止”按鈕,將windowsmanagementinstrumentation服務(wù)暫時停止運(yùn)行。之后,打開計算機(jī)系統(tǒng)的資源管理器窗口,在該窗口中依次展開“windows”、“system32”、“wbem”、“repository”文件夾,然后將“repository”文件夾窗口中的所有文件進(jìn)行一下備份,備份完成后將該文件夾中的所有內(nèi)容全部清除掉;
接下來,重新啟動一下計算機(jī)系統(tǒng),待系統(tǒng)啟動成功后,按前面*作打開windowsmanagementinstrumentation服務(wù)的屬*設(shè)置界面,單擊該界面中的“啟動”按鈕,相信這么一來windowsmanagementinstrumentation服務(wù)就能正常運(yùn)行了。
修復(fù)系統(tǒng)損壞文件
如果計算機(jī)系統(tǒng)不小心感染了病毒或者發(fā)生了誤刪除*作,那么與系統(tǒng)內(nèi)存讀寫*作有關(guān)的系統(tǒng)文件很可能受到損壞,而這些系統(tǒng)文件一旦受到損壞的話,那么我們就很容易遭遇內(nèi)存讀寫故障提示了。所以,我們一旦碰到內(nèi)存讀寫錯誤的提示時,不妨按照如下步驟修復(fù)一下系統(tǒng),看看系統(tǒng)是否存在損壞的文件:
首先使用最新版本的殺毒軟件,來對計算機(jī)系統(tǒng)進(jìn)行徹底地病毒查殺*作,因為計算機(jī)系統(tǒng)一旦感染了病毒而不進(jìn)行清除的話,我們即使修復(fù)了系統(tǒng)文件,病毒仍然有可能會繼續(xù)破壞系統(tǒng)文件,所以及時使用殺毒軟件來將計算機(jī)中的病毒全部清除干凈,可以確保系統(tǒng)文件不會繼續(xù)受到病毒的威脅。
其次使用系統(tǒng)自帶的“sfc”命令,來嘗試將受到損壞的系統(tǒng)文件修復(fù)到正常狀態(tài)。在修復(fù)受損系統(tǒng)文件時,只要在運(yùn)行中輸入“cmd”,打開“命令提示符”窗口,在其中輸入字符串命令“sfc/scannow”,單擊回車鍵后,該命令程序就會對系統(tǒng)每個角落處的系統(tǒng)文件進(jìn)行搜索掃描,一旦發(fā)現(xiàn)系統(tǒng)文件的版本不正確或者系統(tǒng)文件已經(jīng)損壞的話,它就能自動*出提示界面,要求我們*入windows系統(tǒng)的安裝光盤,以便從中提取正常的系統(tǒng)文件來替代不正常的系統(tǒng)文件,從而達(dá)到修復(fù)系統(tǒng)文件的目的。要是系統(tǒng)修復(fù)*作成功的話,相信我們重新啟動計算機(jī)系統(tǒng)時,就不會看到有什么不正常的現(xiàn)象了。
及時釋放系統(tǒng)內(nèi)存
我們知道,在運(yùn)行一些容量較大的程序或者游戲時,需要消耗相當(dāng)?shù)南到y(tǒng)內(nèi)存資源,要是此時內(nèi)存空間不夠時,那么系統(tǒng)內(nèi)存讀寫錯誤的故障提示很有可能就會發(fā)生。為了有效避免這種錯誤提示,我們最好在運(yùn)行容量較大的程序或者游戲之前,應(yīng)該先將計算機(jī)系統(tǒng)重新啟動一下,這樣能夠?qū)⑾到y(tǒng)內(nèi)存空間充分釋放出來;如果計算機(jī)內(nèi)存空間本身就比較小的話,那么我們建議各位最好及時升級內(nèi)存,以便拓展內(nèi)存的有效使用空間,以防止由于系統(tǒng)內(nèi)存不足而造成系統(tǒng)內(nèi)存讀寫錯誤的發(fā)生。
當(dāng)然,在系統(tǒng)自身內(nèi)存空間不足的情況下,我們應(yīng)該先將那些隨機(jī)啟動的殺毒軟件以及相關(guān)即時*的程序暫時關(guān)閉掉,之后再嘗試運(yùn)行容量較大的應(yīng)用程序或者網(wǎng)絡(luò)游戲,因為殺毒軟件及相關(guān)*程序會在一定程度上消耗一些系統(tǒng)內(nèi)存資源,將它們關(guān)閉可以節(jié)省不小的內(nèi)存空間,從而能夠有效避免內(nèi)存讀寫錯誤現(xiàn)象的發(fā)生。當(dāng)然,值得注意的是,我們在運(yùn)行完大容量的程序或游戲之后,還必須記得及時將相關(guān)程序的*功能全部打開。
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 yyfangchan@163.com (舉報時請帶上具體的網(wǎng)址) 舉報,一經(jīng)查實,本站將立刻刪除