JVM內存溢出常見的有一下兩種:html
第一種:java.lang.OutOfMemoryError: PermGen spacejava
第二種:java.lang.OutOfMemoryError: Java heap spaceapache
第一種異常緣由是由於咱們項目中須要加載的文件太多所致使,項目發佈時class文件和jar文件會被加載到jvm的永久區,當永久區空間不足時則會拋出 java.lang.OutOfMemoryError: PermGen space;windows
第二種爲堆棧溢出,此異常在項目運行其產生,因爲運行期產生太多的對象實例而沒有被gc,因此纔會拋出該異常;tomcat
針對以上兩種異常,和Tomcat使用狀況的不一樣,有以下三種解決方案:jvm
1 、Tomcat解壓版 經過startup.bat腳本運行:spa
當咱們經過startup.bat運行tomcat時,須要記事本catalina.bat並找到日誌
echo Using CATALINA_BASE: "%CATALINA_BASE%"該行,server
而後在上面添加htm
set JAVA_OPTS=%JAVA_OPTS% -server -Xms100m -Xmx1024m -XX:PermSize=20m -XX:MaxPermSize=100m
並將參數設置合理值。
2. Tomcat解壓版 註冊爲系統服務
解壓版註冊爲系統服務方式爲,cmd 進入tomcat/bin目錄而後執行service.bat install 服務名稱;
當你下載的解壓文件中沒有service.bat請到官網從新下載,你可能不會遇到該問題,但我遇到了!
此時咱們能夠打開系統服務管理界面看到咱們註冊成功的tomcat服務
如上圖我註冊的系統服務爲:tomcat9090,此時咱們就能夠在此關閉和啓動tomcat服務,並能夠設置爲開機自啓;
若是服務註冊成功卻沒法啓動,如:
或者錯誤代碼爲1;
請查看Tomcat logs日誌,開發中看日誌,和記錄日誌相當重要。
沒法啓動可能有一下緣由:
2.1,也是網上挺多的:將JDK中BIN下的 msvcr71.dll 複製到 TOMCAT 中的 BIN 下(沒有解決問題)
2.2,檢查jdk版本是否過低
2.3,查看jdk和tomcat是否都是32位或64位,當二者位數不一樣是經過startup.bat腳本是能夠啓動,但當註冊爲系統服務時是無 法啓動的,固然tomcat安裝版也同樣,要使用位數相同,且版本更新時間相近;
2.4,當tomcat服務能夠啓動,但在啓動過程當中中止,請查看logs日誌,此時最大可能爲PermGen space,解決方案爲
2.4.1:
卸載服務:cmd 進入tomcat/bin目錄而後執行service.bat uninstall 服務名稱;
而後打開service.bat文件找到
--JvmOptions "-Dcatalina.home=%CATALINA_HOME%;.................E%\conf\logging.properties"並在尾部添加
-XX:PermSize=20m;-XX:MaxPermSize=100m參數之間以「;」相隔
如:「...............conf\logging.properties;-XX:PermSize=20m;-XX:MaxPermSize=100m"參數值按我的所需設定;
並設置下列兩個參數:
--JvmMs 128 ^
--JvmMx 1024
以上設置完成後請從新註冊系統服務;
2.4.2:打開註冊表
HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat9090\Parameters\Java
Options右擊,修改,添加-XX:PermSize=20m;-XX:MaxPermSize=100m
如圖:
而後重啓服務;
3.Tomcat 安裝版,如出現沒法安裝,或沒法啓動等問題請參考2.2至2.4解決方案;
JVM內存參數說明請參考官網:
http://tomcat.apache.org/tomcat-7.0-doc/windows-service-howto.html
累屁了,回家吃飯。。。。。