故障現象:
由記憶體溢出(OutOfMemoryError: PermGen space)
故障原因:
1. 本身比較龐大,系統初始加載的類超過9000個,JDK1.8(不含)之前的JDK通過配置設定永久儲存區域(Permanent Generation space)加載class,系統預設設定約64M,不能滿足系統加載的要求,系統運作一段時間後,永久儲存區域占滿就出現記憶體溢出。
2.PermGen space的全稱是PermanentGeneration space,是指記憶體的永久儲存區域,這塊記憶體主要是被JVM存放Class和Meta資訊的,Class在被Loader時就會被放到PermGen space中,它和存放類執行個體(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程式運作期對PermGenspace進行清理,是以如果你的應用中有很CLASS的話,就很可能出現PermGen space錯誤,這種錯誤常見在web伺服器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm預設的大小那麼就會産生此錯誤資訊了。但目前的hibernate和spring項目中也很容易出現這樣的問題。可能是由于這些架構會動态class,而且jvm的gc是不會清理PemGen space的,超過了jvm預設的大小,導緻記憶體溢出。
解決方案:
首先:
将綠色的Tomcat 注冊為服務
1. 進入到tomcat 的目錄所在
a) 在cmd 下
Cd D:\ProgramFiles\apache-tomcat-7.0.40>cd bin (也可以一級一級進入目錄)
b) 注冊 service.bat install serviceName (服務名),發下是成功提示
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TO0gjMzMTN4ETNxcDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
c) 删除 服務 sc delete Tomcat7,以下是成功提示
d) Tomcat以Windows服務的方式啟動的情況下,通過Tomcat7w.exe打開啟動參數設定界面,在JAVA标簽頁下的啟動參數部分設定PermSize、MaxPermSize,加大記憶體
在 CMD 下進入到Tomcat Bin目錄執行以下指令
會彈出以下對話視窗
e) 在對話視窗的 “JAVA”頁籤下 / “Java Options” 下的完整内容如下:
/**** 原有内容Start ***/
-Dcatalina.base=D:\ProgramFiles\apache-tomcat-7.0.40
-Dcatalina.home=D:\ProgramFiles\apache-tomcat-7.0.40
-Djava.endorsed.dirs=D:\ProgramFiles\apache-tomcat-7.0.40\endorsed
-Djava.io.tmpdir=D:\ProgramFiles\apache-tomcat-7.0.40\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=D:\ProgramFiles\apache-tomcat-7.0.40\conf\logging.properties</span><span style="color:#538135;">
/****原有内容 End ***/
/****聽設定内容 Start ***/
</span><span style="color:#333333;">-Djava.rmi.server.hostname=0.0.0.0
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port="9090"
-Dcom.sun.management.jmxremote.authenticate="false"
-Dcom.sun.management.jmxremote.ssl="false"</span><span style="color:#538135;">
/****聽設定内容 End ***/
/****服務啟動設定内在内容 Start ****/
-XX:PermSize=256M
-XX:MaxPermSize=256M
/****服務啟動設定内在内容 Start ****/
說明:注釋隻起到說明作用,添加時不要添加注釋部分内容
1. 以startup.bat方式指令
行方式啟動的情況下,在Tomcat/bin/catalina.bat内設定保區記憶體大小
在“echo"Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行
JAVA_OPTS="-server-XX:PermSize=128M -XX:MaxPermSize=128m
2. JDK1.8以上版本說明
使用JDK1.8以上版本,可規避此問題,jdk1.8之後使用元空間Metaspace代替了PermGen space,預設情況下,類中繼資料配置設定受到可用的本機記憶體容量的限制,是以不會出現儲存區記憶體溢出的問題了,系統無需做其它設定。
輔助工具:
Visualvm可監控JVM運作期間的記憶體占用情況,可觀察Tomcat程序記憶體占用和儲存區占用/中繼資料空間的内容占用曲線,可以有效分析系統運作狀态,可确認設定是否生效
下載下傳位址:https://visualvm.java.net/
tomcat日志檢視 系統記憶體溢出
解決步驟:
1、停止tomcat服務
2、cmd 打開指令視窗,進到tomcat的bin目錄下
3、輸入指令tomcat7w.exe//ES//sbba (注:sbba是注冊到服務中的tomcat服務名)打開tomcat的Properties(屬性)如圖附件20圖一,點選java檢視tomcat的端口
4、檢視Java Options-Dcom.sun.management.jmxremote.port="9090"
5、打開visualvm_138檔案目錄bin下建立的快捷方式開始監控tomcat項目耗費資源的曲線圖(VisualVM可生成和分析海量資料、跟蹤記憶體洩漏、監控垃圾回收器、執行記憶體和CPU分析,同時它還支援在MBeans上進行浏覽和操作),從第4步得知tomcat項目所占用的端口是9090 ,是以建立JMX端口為9090 如圖附件下圖
打開建立的監聽,就可以看到TOMCAT 相關的端口了
重新開機伺服器,等待tomcat項目自啟動後,可正常通路系統了