天天看點

記憶體溢出問題解決方案與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  (服務名),發下是成功提示

記憶體溢出問題解決方案與Visualvm監聽添加

c)        删除 服務 sc delete Tomcat7,以下是成功提示

記憶體溢出問題解決方案與Visualvm監聽添加

d)       Tomcat以Windows服務的方式啟動的情況下,通過Tomcat7w.exe打開啟動參數設定界面,在JAVA标簽頁下的啟動參數部分設定PermSize、MaxPermSize,加大記憶體

在 CMD 下進入到Tomcat Bin目錄執行以下指令

記憶體溢出問題解決方案與Visualvm監聽添加

會彈出以下對話視窗

記憶體溢出問題解決方案與Visualvm監聽添加

 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 如圖附件下圖

記憶體溢出問題解決方案與Visualvm監聽添加
記憶體溢出問題解決方案與Visualvm監聽添加
記憶體溢出問題解決方案與Visualvm監聽添加
記憶體溢出問題解決方案與Visualvm監聽添加
記憶體溢出問題解決方案與Visualvm監聽添加
記憶體溢出問題解決方案與Visualvm監聽添加

打開建立的監聽,就可以看到TOMCAT      相關的端口了

記憶體溢出問題解決方案與Visualvm監聽添加
記憶體溢出問題解決方案與Visualvm監聽添加

重新開機伺服器,等待tomcat項目自啟動後,可正常通路系統了

繼續閱讀