最近在做一個網站,使用的編程語言是jsp,Web服務器采用Resin-2.1.6發布,操作系統使用linux9.0,但是在網站運行過程中發現java可用內存越來越少,有時程序會報出java.lang.OutOfMemoryError的錯誤,甚至導致Resin死機。 其實這種現象在Java語言中很正常,我們通常稱之為Java內存溢出。由于我們在Java程序中聲明了好多對象,占用了內存空間,程序結束時沒有將這些對象或對象的引用進行釋放,從而導致Java虛擬機(JVM)進行垃圾回收(GC)時,不能夠回收這些對象。這樣,Java所用的內存就會一直增加,直至溢出,進而導致Resin死機。 導致Java內存溢出的根本原因是Java程序的不規范或不健壯。因此,從根本上解決Java內存溢出的唯一方法就是修改Java程序,及時地釋放沒用的對象,釋放內存空間。 除了這個方法以外,還有一些應急措施,可以臨時緩解一下系統的運行。Resin默認情況是死機以后不能訪問網站,必須手動重啟Resin,但不可能一直看在機器旁邊,看Resin有沒有死機。所以這里介紹一種讓Resin自重啟的方法。 打開Resin的配置文件resin.conf(一般情況下,該文件在Resin目錄的conf文件夾下)。里面有一段內容如下所示: <!-- - Ping to test if the web server is still up. You can uncomment this - and point it to pages on the webserver that exercise your main - logic (like database access). If the GET fails, it will restart - the server. This will catch deadlocks, but not JDK freezes. - <ping sleep-time=’1m’ retry-count=’3’ retry-time=’1s’> - <url>http://localhost:8080/ping/ping.jsp</url> - </ping> --> 這段內容默認情況下是被注釋的。它的功能是讓Resin每隔一分鐘就測試一下能否訪問/ping/ping.jsp文件,測試時間是1s,假如不成功,就重試三次。假如三次都不成功,Resin就自動重啟。所以將這段話下半部分(從"<ping "到"</ping>")的注釋去掉,然后在Resin的發布目錄中新建一個文件夾ping,在ping文件夾下新建一個ping.jsp文件,文件中可以寫入簡單的一句話,如:<% out.PRintln("Hello world");%>。 好,大功告成,啟動Resin,這樣就不用擔心Java內存溢出導致Resin死機了,因為Resin死機后會馬上重新啟動。 當然,這只是應急措施,不是長久之計。假如從長計議,還是要耐心的更改Java程序?。。?