2011-08-12 156 views
3

我有一個運行在Tomcat上的Java應用程序(作爲Windows上的服務運行),java進程在最終要求我重新啓動之前繼續佔用CPU Tomcat服務。排除非常高的CPU使用率的Java進程 - Tomcat應用程序

首先我的設置: 在Windows 2003服務器 的Tomcat 6,運行在使用包裝 JDK服務:1.6.0_20

我在這裏看到的漁獲物問題,有領導到昨天。我必須在昨天中午重新啓動,然後在今天凌晨2:30,然後今天我幾乎不能重新啓動應用程序,並打開jconsole進行監視,然後再次使用99%的CPU。通過一些我不太確定的事情,看起來我有JVM自行循環,應用程序在10-30%的CPU使用範圍內徘徊了幾個小時。然而,它又開始爬起來,最終進入其99%的CPU使用率細分。我也遇到了高內存使用的問題,但由於我所謂的讓JVM「循環」(壞的術語也許,但它看起來確實如此),並且在包裝器日誌中保持相當正常和穩定有一個所有正在重新加載的類的轉儲)。

然後我四處挖掘,發現在服務器上安裝了JRE 6 Update 24(我沒有安裝它,因爲我對每個java更新進行了全面測試 - 但也許我的服務器管理員進行了更新)。我嘗試過,但無法卸載。因此,我得到不同的版本時,我做了java -versionjavac -version

java -version 
    java version "1.6.0_24" 
    Java(TM) SE Runtime Environment (build 1.6.0_24-b07) 
    Java HotSpot(TM) Client VM (build 19.1-b02, mixed mode, sharing) 

javac -version 
    javac 1.6.0_20 

難道這種差異會造成各種各樣的JVM衝突? JAVA_HOME和我的PATH變量都指向正確的JDK安裝。

爲了獲得更大的穩定性,我決定更改我的應用程序以運行在以前安裝的JDK上--JDK 1.6.0_04。我改變了wrapper.conf,設置env變量,清理並重建,然後啓動。這看起來更穩定,並且已經持續了大約4個小時。 CPU使用率已經上升到了90年代,然後它似乎再次清除了。我已經做了heapdumps,然後通過Eclipse中的內存分析器(他們沒有發現新的東西)運行它們,我使用jconsole和jtop來查看線程 - 沒有任何東西跳出來,因此,爲什麼我繼續好奇,如果它是一個java/jvm問題。所以,我知道這是一個很長的帖子 - 但我真的不知道該從哪裏出發。有任何想法嗎? (我已經在這方面做了詳盡的網絡搜索,一些文章指出可能是Quartz問題或者Hibernate查詢沒有刷新。自從我開始看到CPU問題後,應用程序中沒有任何更改,所以我不確定在哪裏可以開始故障排除,如果它確實可以鏈接到任何一個)。

回答

2

這不是一個簡單的問題。你正在做所有的基礎知識,看看它是否有東西跳出來。這聽起來像是有一個緩慢的泄漏,隨着時間的推移,它會無法運行。這聽起來像GC是抖動和應用程序無響應。它也可能是失控的背景作業,在CPU上吃東西並且沒有完成,這可能解釋了長時間的延遲。你可以嘗試關掉任何石英,看看它是否保持更長的時間,這可能會幫助你朝一個方向發展,或者讓它變得更快,以便它更快顯示出來。

我知道你已經做了一些jconsole監視,但我認爲你需要重新審視並觀察你的內存使用情況,線程運行時間,你在GC中花費多少時間,以及看內存的哪些部分正在吃掉了(是伊甸園,永久使用權呢?)。

我會確保你寫出在Quartz中運行的後臺作業的開始和結束消息。然後,您可以在開始和結束時關聯此問題何時開始。也會告訴你,如果你的工作正在完成或沒有完成。

這可能是將它放到探查器(而不是jconsole)中的時候了,所以你可以看到它在代碼中花費了多少時間或者什麼會炸燬內存。一個真正的分析器可以讓你看到你的代碼和類中所有的數據。我的最愛是JProfiler,但YourKit也不錯。您可以進行7-30天的試用,這樣您就可以有足夠的時間進行配置,並且無需購買即可解決問題。

從早上開始,所以你會希望在早上看到某些東西。

+0

感謝您的回覆。我確定了一個應用程序代碼問題,我認爲這是一個問題。自從保存一次之後不久,它就穩定下來了,所以我希望儘可能好,儘管我仍然在分析它並試圖找到其他任何可能的代碼問題。 –