記錄2023-03月 吐槽一下Tomcat內(nèi)存溢出問題
記錄2023-03月 吐槽一下Tomcat內(nèi)存溢出問題
在2023年03月左右,我負(fù)責(zé)管理的Tomcat服務(wù)器出現(xiàn)了內(nèi)存溢出異常,服務(wù)器為windows,Tomcat8,JDK8。
請求頁面的時候效果如下圖所示。
?

最開始我以為是Tomcat某個功能寫到內(nèi)存不足了,這臺服務(wù)器本身做了初始化增加Xmx之類的配置調(diào)優(yōu),主要是Xms和Xmx,配置在catalina.bat之中。
-Xms:表示?Java?初始化堆的大小,-Xms?與-Xmx?設(shè)成一樣的值,避免?JVM?反復(fù)重新申請內(nèi)存,導(dǎo)致性能大起大落,默認(rèn)值為物理內(nèi)存的?1/64,默認(rèn)(MinHeapFreeRatio參數(shù)可以調(diào)整)空余堆內(nèi)存小于?40%?時,JVM?就會增大堆直到?-Xmx?的最大限制。
-Xmx:表示最大?Java?堆大小,當(dāng)應(yīng)用程序需要的內(nèi)存超出堆的最大值時虛擬機(jī)就會提示內(nèi)存溢出,并且導(dǎo)致應(yīng)用服務(wù)崩潰,因此一般建議堆的最大值設(shè)置為可用內(nèi)存的最大值的80%。如何知道我的?JVM?能夠使用最大值,使用?java -Xmx512M -version?命令來進(jìn)行測試,然后逐漸的增大?512?的值,如果執(zhí)行正常就表示指定的內(nèi)存大小可用,否則會打印錯誤信息,默認(rèn)值為物理內(nèi)存的?1/4,默認(rèn)(MinHeapFreeRatio參數(shù)可以調(diào)整)空余堆內(nèi)存大于?70%?時,JVM?會減少堆直到-Xms?的最小限制。
所以我覺得可能是某個功能查出了問題。后續(xù)檢查出來某一個函數(shù)需要遞歸整個磁盤的文件夾,但是歷史上這個功能并未出現(xiàn)任何問題。我開始對這次異常進(jìn)行了懷疑。
我懷疑是不是有人動過服務(wù)器了?明明運(yùn)行很久的服務(wù)器,配置項也仍然存在,為什么會突然內(nèi)存不足。畢竟我查看了windows本身的服務(wù)器管理程序,發(fā)現(xiàn)當(dāng)前服務(wù)器的內(nèi)存使用量是很低的。
所以單純的是程序的內(nèi)存不足,卻不是服務(wù)器的內(nèi)存不足,程序的內(nèi)存又是調(diào)優(yōu)過的,那么還能改哪里?
糾結(jié)了幾個小時,出門抽了好幾顆煙,突然想到,會不會有人莫名其妙去改一下注冊表之中的信息?這系統(tǒng)運(yùn)行好幾年了,不應(yīng)該有人手欠去改注冊表吧?
本臺服務(wù)器上一共配置了5臺tomcat,其中另外兩臺的注冊表竟然和第3臺的不一樣,簡直想罵人。
第一臺注冊表信息如下所示。
?

結(jié)果第二臺和第三臺服務(wù)器這里被改成了125和268,畢竟三臺服務(wù)器改了兩臺,怎么可能是最開始配置的問題?雖然最開始不是我配置的,但是不可能有人配置服務(wù)器改了3臺服務(wù)器的初始化內(nèi)存,少改兩臺服務(wù)器的初始化內(nèi)存吧?
另外值得一提的是,這個regedit是窗口一直打開在服務(wù)器桌面上的,最開始沒注意,結(jié)果發(fā)現(xiàn)一直是打開狀態(tài),并且目錄就是Java這兩行。
吐槽一下,真不知道誰為什么會這么干活?改一個運(yùn)行很久的服務(wù)器的注冊表,最后還不通知別人。幸虧靈機(jī)一動想到了注冊表這事,不然不一定搞多久了。
地址:
HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Apache Software Foundation/Procrun 2.0 /dataService/report11
?