記憶體溢位問題解決方案與Visualvm監聽新增
故障現象:
由記憶體溢位(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 (服務名),發下是成功提示
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程序記憶體佔用和儲存區佔用/元資料空間的內容佔用曲線,可以有效分析系統執行狀態,可確認設定是否生效
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專案自啟動後,可正常訪問系統了