2010-01-31 68 views
10

我試圖讓Tomcat,它當前作爲Windows 2003框上的服務運行,在OutOfMemoryError上轉儲堆。我可以讓Tomcat作爲服務運行來轉儲堆嗎?

(Tomcat正在運行哈德森,這是在我的構建的尾部報告堆空間的問題。運行構建手動不會產生這樣的錯誤。哈德遜球員需要一個堆轉儲上手。)

根據其他地方的指示,我告訴Apache服務監視器配置它用來運行Tomcat的JVM,以便在遇到OutOfMemoryError時向JVM選項添加以下內容來轉儲堆: -XX:+ HeapDumpOnOutOfMemoryError 然後我運行構建再次。果然,它報告有一個堆錯誤。我掃描整個磁盤尋找默認的java_pid123.hprof文件(其中顯然123被JVM的PID取代)。任何地方都不存在.hprof文件。

我陷入了一個問題22:我需要Hudson人的堆轉儲修復他們的內存泄漏,但是如果我在Tomcat下運行Hudson,我無法獲得堆轉儲。

當Tomcat作爲Windows服務運行時,是否有某種特殊方式在OutOfMemoryError上從它獲取堆轉儲?

我試過的另一件事是在啓動和關閉標籤上告訴它使用「Java」選項而不是「jvm」選項。我相信這應該告訴服務管理器嘗試使用Java可執行命令啓動Tomcat,而不是直接啓動jvm.dll。當我這樣做時,服務將無法啓動。

當然有人有類似的問題?

+0

我應該提到,我已經使用jconsole附加到了Tomcat,並觀察到堆使用率永遠不會超過60MB。 – 2010-01-31 15:33:41

回答

5

終於把這個上牀後,我想回答這個爲別人誰可能有同樣的問題。

首先,如果您在Windows上安裝Tomcat,請勿使用.exe安裝程序,即使它是由Apache提供的。不管你做什麼,它都不會讓你像系統帳戶那樣運行Tomcat。看起來,系統帳戶沒有權限在當前目錄中寫入.hprof文件,並且沒有任何Windows安全性調整似乎會導致此問題消失。

好的,你已經從.zip發行版中安裝了Tomcat。使用service.bat腳本將其作爲服務安裝。確保它被設置爲專門爲此目的創建的特定用戶。確保Tomcat在發生堆轉儲時要寫入的文件夾可由該用戶寫入。

編輯service.bat文件以在正確的位置(您可以放置​​JVM選項的位置)包括-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=C:\whatever選項。這應該夠了吧。

0

.hprof文件被轉儲到當前目錄中。確切地說,對於Windows服務意味着什麼是任何人的猜測,假設它意味着什麼。

我建議發佈一個新問題(在http://superuser.com)詢問「當前目錄」對於Windows服務的含義。

+0

也許是當前目錄,但機器上根本沒有.hprof文件。 – 2010-01-31 20:08:15

+0

所以有可能windows服務沒有「當前目錄」,並且windows正在將文件轉儲到void中。關於瞭解更多關於windows服務站點的建議。 – skaffman 2010-01-31 20:30:15

+0

服務監視器聲明當前目錄是C:\ Program Files \ Apache Tomcat \ Tomcat 6.0。我編寫了一個servlet,將文件輸出到當前目錄,並且該文件顯示在該目錄中。 – 2010-01-31 21:09:58

0

From 20 Tips for Using Tomcat in Production

以下內容添加到您的JAVA_OPTS在catalina.sh(或catalina.bat中適用於Windows): - XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/j2ee/heapdumps

+0

問題當然是服務監視器不會調用腳本。 – 2010-01-31 20:07:57

0

如果您使用.exe安裝了tomcat,則可以配置tomcat服務使用除本地系統帳戶以外的帳戶,並且您可以在創建轉儲文件的目錄「c:\ whatever」上指定該用戶權限。記住tomcat服務的一件事是不要以具有管理權限的帳戶運行。所以在windows(用戶組的成員)中創建一個簡單的用戶,並將tomcat服務設置爲用戶此帳戶。並在「c:\ whatever」目錄下授予該用戶權限。這解決了用戶目錄權限問題,但是您必須配置tomcat以進行內存轉儲錯誤。

0

當運行作爲窗口服務的Java程序,您可以通過以下步驟產生堆轉儲,

  1. 運行命令控制檯,管理員
  2. 版本JDK(對於JMAP命令)和JRE的(Java應用程序運行環境)應該是相同的。
  3. 獲取PID沒有正在運行的窗口過程從任務管理器
  4. 該Java應用程序的執行以下命令

JMAP轉儲:文件= d:\堆轉儲\ myHeapDump.hprof -F #PID_No #

如果得到了與JDK/JRE任何異常7嘗試同樣與JDK/JRE 8 其實我遇到了一些問題JMAP與JDK 7,但是當我移動到JDK 8,我能夠成功地生成堆轉儲使用相同的命令

相關問題