tomcat內存溢出OutOfMemoryError

出現OutOfMemoryError PermGen space系統錯誤,經過在網上查閱資料,發現這個錯誤並非Tomcat的問題,而JVM設計自身的一個缺陷,JVM把內存分了不一樣的區, PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域,類加載的時候就存放在這個區域中。原本SUN設計的時候認爲這個區域在JVM啓動的時候就固定了,但他沒有想到如今動態會用得這麼普遍。並且這個區域有特殊的垃圾收回機制,如今的問題是動態加載類到這個區域後,gc根本沒辦法回收!  tomcat

      老外一直認爲這是sun JVM的一個bug,曾有這樣的評價:「A bug this critical is open since 2003? Absolutely shameful」--  我以爲SUN在這個BUG上確實有些丟臉。沒想到至今這個問題還沒未能解決,有人給出最好的解決方法是不使用JDK,使用BEA的JRokit,固然如今Oracle,BEA,SU已經成爲一家人了,我想這個問題應該會更快有更好的解決方案。 eclipse

好了仍是說說如何解決問題吧,網上大量的資料說在tomcat這樣設置:SET JAVA_OPTS= -Xms64m -Xmx512m,但通過本人的測試,沒有一點做用,詳細看了JVM內存的分配機制後才知道,-Xms和--Xmx是調整Java heap space(即堆內存)的大小,ava heap space區域中存放對象,GC會收集這塊區域。 測試

若是出現的異常類型是:OutOfMemoryError: Java heap space,那應該設置 SET JAVA_OPTS= -Xms64m -Xmx512m。 this

若是出現的異常類型是:OutOfMemoryError  PermGen space,那應該設置set JAVA_OPTS=-Xms128m -Xmx512m  -XX:PermSize=128M -XX:MaxPermSize=256m spa

常見的有兩種設置方法: 設計

若是在開發環境中啓動tomcat,以eclipse爲例:選擇window->Preferences->MyEclipse-servers-Tomcat->JDK 在右側框Optional Java  VM arguments中加入:-Xms128m -Xmx512m  -XX:PermSize=128M -XX:PermSize=256M server

      若是獨立啓動tomcat,修改tomcat/bin/catalina.bat文件,查找set JAVA_OPTS,找到後把這一行修改成: 對象

set JAVA_OPTS=-Xms128m -Xmx512m  -XX:PermSize=128M -XX:MaxPermSize=256M,設置的時候要注意:-Xms+X:PermSize不能大於系統支持的最大JVM的大小。具體大小根據本身內存大小調整吧。 ip

相關文章
相關標籤/搜索