2012-08-16 39 views
3

我有一臺運行tomcat7的linux(ubuntu)服務器。服務器有1GB的RAM,並且我正在從java拋出堆空間錯誤。tomcat java.util.logging進程

基本上發生了什麼,是我的Tomcat服務器(運行我的servlet代碼)拋出異常,因爲沒有更多的內存來分配。我的代碼非常精簡,所以我不認爲這是問題。

當我看着HTOP,我看到了很多Java記錄過程中,我看到約30這些進程:

ps ax | grep java 
7412 pts/0 Sl  0:02 /usr/bin/java -Djava.util.logging.config.file=/usr/share/tomcat/apache-tomcat-7.0.29/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat/apache-tomcat-7.0.29/endorsed -classpath /usr/share/tomcat/apache-tomcat-7.0.29/bin/bootstrap.jar:/usr/share/tomcat/apache-tomcat-7.0.29/bin/tomcat-juli.jar -Dcatalina.base=/usr/share/tomcat/apache-tomcat-7.0.29 -Dcatalina.home=/usr/share/tomcat/apache-tomcat-7.0.29 -Djava.io.tmpdir=/usr/share/tomcat/apache-tomcat-7.0.29/temp org.apache.catalina.startup.Bootstrap start 
7426 pts/0 D+  0:00 grep --color=auto java 
25937 ?  Sl 13:12 /usr/bin/java -Djava.util.logging.config.file=/usr/share/tomcat/apache-tomcat-7.0.29/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat/apache-tomcat-7.0.29/endorsed -classpath /usr/share/tomcat/apache-tomcat-7.0.29/bin/bootstrap.jar:/usr/share/tomcat/apache-tomcat-7.0.29/bin/tomcat-juli.jar -Dcatalina.base=/usr/share/tomcat/apache-tomcat-7.0.29 -Dcatalina.home=/usr/share/tomcat/apache-tomcat-7.0.29 -Djava.io.tmpdir=/usr/share/tomcat/apache-tomcat-7.0.29/temp org.apache.catalina.startup.Bootstrap start 

這些Java進程緩慢泄漏內存隨着時間的推移,因爲我只有1GB的與我的tomcat服務器玩ram開始拋出堆空間異常。

我曾與log4j的撥弄(但應關閉),我已經做了所有我可以關閉日誌記錄在CONFIGS我能找到。

任何幫助將是巨大的,我只需要擺脫這些過程的 - 他們的方式貪婪。謝謝!

〜丹

編輯:更多的信息:

嗨,這可能是一個足夠大的提示完全解決這一個 - 我查了一些啓動調試以及與此想出了:

Oct 02, 2012 8:50:08 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 

SEVERE: The web application [/NMVServer] appears to have started a thread named [http-bio-8080-exec-53] but has failed to stop it. This is very likely to create a memory leak. 
Oct 02, 2012 8:50:08 AM org.apache.catalina.loader.WebappClassLoader 
clearReferencesThreads 

SEVERE: The web application [/NMVServer] appears to have started a thread named [http-bio-8080-exec-54] but has failed to stop it. This is very likely to create a memory leak. 
Oct 02, 2012 8:50:08 AM org.apache.catalina.loader.WebappClassLoader 
clearReferencesThreads 

SEVERE: The web application [/NMVServer] appears to have started a thread named [http-bio-8080-exec-62] but has failed to stop it. This is very likely to create a memory leak. 
Oct 02, 2012 8:50:08 AM org.apache.catalina.loader.WebappClassLoader 
clearReferencesThreads 

SEVERE: The web application [/NMVServer] appears to have started a thread named [http-bio-8080-exec-64] but has failed to stop it. This is very likely to create a memory leak. 

我發現泄漏的一個問題是由於根據幾個論壇的JDBC驅動程序http://bugs.mysql.com/bug.php?id=36565的錯誤。這解決了我收到的另一個信息。

我一直環顧四周,我發現這是非常有用的:

http://wiki.apache.org/tomcat/MemoryLeakProtection

現在我只是想通過您的所有提醒感謝堆工作!

〜丹

+0

請運行'ps ax | grep java'並粘貼一個* full *命令行。您粘貼的部分只顯示一堆配置選項。被稱爲實際的類是不可見的... – thkala 2012-08-17 11:24:25

+0

對不起,延遲和dodgey的初始職位。我已經用適當的信息更新了它。 – FaddishWorm 2012-08-19 23:03:33

+0

你的意思是你有大約30個進程與你的文章中的pid 7412類似。但是這個過程代表了整個Tomcat服務器,從「org.apache.catalina.startup.Bootstrap start」中可以看出。那意味着你有30臺服務器正在運行? – Nikem 2012-10-01 13:00:54

回答

3

我一般我會期待在java中的日誌記錄代碼已經過很好的測試。如果您的日誌配置沒有生成日誌輸出,它的開銷很低。您的htop結果可能會在tomcat中顯示一些空閒的線程狀態。

它可以被記錄,但你可能要考慮all the ways your application or another component may be leaking memory

所有JVM的有診斷內存泄漏相當不錯的工具。像this這樣的主題討論瞭解發生什麼的好方法。

編輯:些心思

您可能要檢查會話太多配置,如果大量的請求使用HttpServletRequest.getSession()Manager組件配置進入Context,對於無限制會話,默認值爲-1。

的情況下,與the current issue fix list檢查您的Tomcat版本,你遇到一個已知的內存泄漏。

最後,Tomcat 7包含一個JreMemoryLeakPreventionListener,可能顯示資源未被釋放。

+1

謝謝,這給了我一個很好的起點。我知道有幾種方法可以愚弄垃圾收集器(可以這麼說) - 我已經開始調查我的mysql連接器池並查看其他區域。感謝您的建議。 – FaddishWorm 2012-09-25 00:18:01

+0

P.S.關於servelets和大量使用「doPost」例程有什麼特別之處嗎? – FaddishWorm 2012-09-25 00:18:58

+0

一般doPost()是無狀態的,不應該保持任何連接或創建任何永久對象。重負荷應該不重要。 – pd40 2012-09-25 01:01:10

1

Tomcat通常有一個線程池。 Java EE規範要求啓動一個單獨的線程來處理每個HTTP請求。 Tomcat有一個線程池,並重用池中的線程,而不是創建和終止它們。更多詳情,請here

您可以通過(分別或setenv.bat)修改setenv.sh設置Tomcat的最大內存限制如:可

CATALINA_OPTS='-Xms512m -Xmx1024m' 

更多細節針對Oracle JVM here

但實際上最重要的是跟蹤JVM內部的內存分配。您將需要Java VisualVM