1. 程式人生 > >記憶體溢位問題解決方案與Visualvm監聽新增

記憶體溢位問題解決方案與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專案自啟動後,可正常訪問系統了