java head space/ java.lang.OutOfMemoryError: Java heap space內存溢出


上一篇JMX/JConsole調試本地還可以在centos6.5 服務器上進行監控有個問題端口只開放22那么設置的9998端口 你怎么都連不上怎么監控?(如果大神知道還望指點,個人見解)

線上項目出現了org.apache.solr.servlet.SolrDispatchFilter - null:java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space

於是采用了在tomcat里面catalina.sh里面配置進行監控

JAVA_OPTS="-Xms5120m -Xmx5120m -Xss512K -XX:PermSize=256m -XX:MaxPermSize=256m -XX:SurvivorRatio=4 -XX:-UseGCOverheadLimit
-XX:NewSize=3096m
-XX:MaxDirectMemorySize=1024m
-XX:+ExplicitGCInvokesConcurrent
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseCompressedOops
-XX:-ReduceInitialCardMarks
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/data/tomcat/java.hprof
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-verbose:gc 
-Xloggc:/var/data/tomcat/gc.log
-Dcom.sun.management.jmxremote.port=1099
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
"

注意加紅字體的路徑要記得只需要指定目錄就行gc.log java.hprof會自動創建。

采用了 MemoryAnalyzer 進行dump分析:

溫馨提示:使用此工具的時java.hprof 如果文件大小高達3-9G需要到MemoryAnalyzer.ini -Xmx3072m 9個G需要設定5096m 否則分析一半卡死。

分析結果如下圖

 

由最后第二張圖可知大多數的溢出都是由TopFieldCollector類里面的一個MulitiComparatorsFile方法,其他類也有溢出是因為extends繼承了TopFieldCollector 。但是考慮這個代碼是由apache組織寫的不可能有這么大bug沒發現,所以考慮是存在系統var/data/下面的索引文件問題,初始化為5.8G大小索引,可以嘗試初始化索引。

  我的情況是3個tomcat1,tomcat2,tomcat3 然后每個tomcat下面webapps都有源代碼那么3個tomcat都加載是否加載了3次索引導致內存撐爆。然后采用tomcat1,tomcat2,tomcat3共用/home/tomcat/webapps來進行。

另外tomcat server.xml里面會有FULL GC不知道據說是tomcat6的一個bug為了檢測監聽內存泄露 大家要稍微注意下

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"gcDaemonProtection="false"/>

  以上純屬個人觀點,如果錯誤還望大神指出,小弟技術菜鳥 思維一般。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM