2013-02-06 61 views
4

我確實遇到了我開發的應用程序的問題。當我長時間運行它時,CPU負載緩慢上升。這是45分鐘後Java VisualVM的屏幕截圖。增加的CPU負載來自哪裏?

enter image description here

正如你可以看到,內存佔用是非常穩定和線程,以及數量。應用程序打開一個LAN插座並每2秒進行一次測量。這個測量運行在一個單獨的線程中(可以在右下方的線程圖中看到)。

CPU使用率緩慢而穩定地增加,一夜之間累積到70-80%左右,此時整個系統明顯放慢(顯然)。現在我不想要這個增長,但是找不到原因。沒有內存泄漏(這也會導致內存的連續增加),也不會產生越來越多的線程(因爲這個計數也是穩定的)。

我的應用程序有一個廣泛的GUI和幾個線程。下面是從探查線程列表:

enter image description here

我標有「我」的線程黃色。因此,MeasurementCommunication.startMeasurement線程會在需要時創建(並再次終止)。所以只有其中一個人在任何時候運行。

因此,長話短說:我不知道這個CPU的增加來自哪裏。你有什麼想法?也許這是一個普遍的Java問題? 如果您需要更多信息或詳細信息,請告訴我,我嘗試回答。 ;)

+3

配置文件的CPU使用情況,並查看熱點時它的位置。 – bmargulies

+2

您是否監控過GC時間(例如-verbose:gc)? – assylias

+0

@assylias會帶來什麼?你認爲GC不能正確工作嗎? – brimborium

回答

3

看看你已經使用過的堆,它從17:00開始出現向上,你需要做的就是長時間捕獲它,並確保它爬升回來並保持/下來,但通常是平坦的使用情況,如果它開始產生像步驟一樣的結果,即越來越高地增加,那麼它可能是內存泄漏,從而導致問題影響你的CPU。所以總之你需要更長時間觀察堆堆,特別是當堆爬上時。因此,每個完整的垃圾收集之間的狀態....

+0

感謝您的建議。我會讓它運行過夜。也許這給了我更多的見解。 Java中的內存泄漏如何工作? GC是否不定期釋放未使用的內存? – brimborium

+0

yep基本上有兩種形式的垃圾收集:全部和部分 - 有關如何啓用日誌記錄全部gc或部分gc的閱讀http://www.theserverside.com/discussions/thread.tss?thread_id = 63241 - 然後查看你的日誌什麼時候發生,並檢查你的圖表 - 它自己的圖表應該提供一個線索 - 如上所述,如果它的螺旋像向上步驟那麼內存泄漏將是原因...... .... – Vahid