1. 程式人生 > >多專案導致Tomcat以服務啟動記憶體溢位報錯“PermGen space”

多專案導致Tomcat以服務啟動記憶體溢位報錯“PermGen space”

使用Tomcat作為並將其註冊為Windows系統服務時,當Tomcat的webapps下的專案比較多的時候,重啟伺服器後,會發現在Windows服務列表中明明顯示服務已啟動,但是訪問Tomcat主頁發現仍然無法訪問,說明服務根本沒有啟動,且去tomcat的logs目錄下去查詢tomcat6-stdout.2015-12-17.log日誌時,發現報錯資訊為java.lang.OutOfMemoryError: PermGen space。

此時,直接在服務中選擇停止時,還有可能報錯“Windows無法停止本機的tomcat服務,錯誤程式碼1053之類的”說明啟動時已經出現錯誤,此時只能通過工作管理員,將tomcat6w.exe的程序關閉才可以。而且如果查詢資料修改了catalina.bat中
set JAVA_OPTS=%JAVA_OPTS% -Xms512m -Xmx512m -XX:PermSize=128M


-XX:MaxNewSize=256m -XX:MaxPermSize=512m %LOGGING_CONFIG%
的配置之後,選擇startup.bat是可以正常啟動的,唯獨作為服務不可以。那麼,說明,catalina.bat中的引數值對執行指令碼時有用。

發生此類錯誤的原因是由於,太多的專案引用第三方jar包,而很多jar包是重複的,比如log4j,比如spring的那麼多jar包。而這些jar在tomcat啟動的時候需要載入到記憶體中,預設的配置無法容納之後出現記憶體溢位,解決的辦法有:

  1. 修改當tomcat註冊為服務之後的jvm的註冊列表的相關配置項
  2. 將所有web工程的專案中WEB-INF下的lib下的jar統一剪下到tomcat的安裝目錄中的lib中。

分別給出具體操作步驟:

具體操作:首先需要注意的是,當在將tomcat安裝為系統服務的時候,執行命令提示符(即cmd視窗),要通過以系統管理員身份執行。否則,可能會導致之後修改完引數報錯,錯誤程式碼為4;當以服務安裝完並配置為自動啟動之後,需要到註冊列表中找到如下選項進行配置。

  • 開啟註冊列表編輯器,找到如下位置HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\tomcat6\Parameters\Java(Win7 X64系統則位於HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\tomcat6\Parameters\Java) ;
  • 雙擊右側視窗的“Options”鍵值,新增如下行:

    -XX:PermSize=256M
    -XX:MaxPermSize=512M 
    修改JvmMs,十進位制為1024
    JvmMx,十進進製為2048
    

    具體修改多少合適請視伺服器配置來定。如果是eclipse的tomcat外掛啟動tomcat,在“window”選單-“Preferences”-“Tomcat”-“JVM Settings”中新增JVM引數如下即可:

    -Xms1024M -Xmx2048M -XX:PermSize=256M -XX:MaxPermSize=512M 
    

    如果是以命令列啟動,在需要在catalina.bat的

    set JAVA_OPTS=-Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m
    
  • 最後建議修改完配置之後,還是把所有需要用到的jar包放到tomcat中我們自己的目錄下,操作如下:
    在apache-tomcat-6.0.37\根目錄下新建一個資料夾(extra-lib),並將提取的jar包放到extra-lib下;修改apache-tomcat-6.0.37\conf\catalina.properties檔案,在其中新增如下程式碼:

    shared.loader=${catalina.base}/extra-lib,${catalina.base}/extra-lib/*.jar