2013-01-10 56 views
17

我第一次查看NetBeans中的剖析器,今天早上我注意到我有超過1700代倖存下來的代表通過Monitor Profiler顯示,但恆定的堆大小。在做一些閱讀時,我發現this article討論了使用NetBeans分析器來發現泄漏。爲什麼char []生存了這麼多代,我應該關心嗎?

因此,在遵循文章的建議,我開始了一個內存分析器。在查看結果時,我發現char []佔絕大多數倖存者。目前作爲這篇文章,char []是在22代並且正在計數。

現在一些posts (comment by OldCurmudgeon near the bottom)表明,如果我的堆是穩定的沒有泄漏,yet others說,如果世代持續增長存在。所以我有點困惑,哪個是對的。

所以,我的問題是:

基於下列屏幕截圖我應該進一步調查潛在的內存泄漏?

Memory(Heap) 內存(堆)

Memory(GC) 存儲器(GC)

Live allocated objects 直播分配對象

回答

8

char[]可能會通過String對象舉行。它們可以在任何地方被創建用於任何目的分析器和JMX使用它們,所以一個什麼都不做的進程將會顯示這些(並且不斷增長的堆)

注意:所有字符串文字和類的名稱等都將存活直到ClassLoader被卸載(這可以程序)

要確定您的堆使用情況是否增長,您應該查看完整GC後保留多少。看看每次下降的底部,看起來和我一樣。其他信息對性能調整很有用,但本身不是問題。

+0

有趣的是,你有任何推薦的資源來閱讀分析? –

+2

我不能說我遇到過任何。我會建議獲得像YourKit這樣的商業分析器的評估版本,以瞭解它有什麼不同。例如它不會使用堆做它的工作,所以它會在堆上產生「噪音」。 –

+2

我會建議分析簡單的程序,你可以瞭解它正在做的所有事情,看看它是如何尋找CPU和內存分析的。這可以幫助您瞭解複雜的應用程序在做什麼(並知道要忽略哪些內容,相當多; –

2

我在分析過程中也遇到了這些揮之不去的字符[]。經過長時間的分析,我得出結論,其中許多是String常量池的char數組。

2

沒有看代碼,人們不知道。有些程序使用TB內存,並且它們工作得很好,因爲它不是內存泄漏,它只是程序的工作方式。

Netbeans documentation只是定義什麼存活幾代是,而不是如何使用該數字來發現內存泄漏。此外,char[]只是String的內容,它可以保留很長時間(甚至與主線程一樣長)。

沒有找到漏洞的靈丹妙藥。您應該在可行的負載下運行您的程序,並查看內存使用情況是否與預期模式一致。如果不是,那麼你有一個問題,但沒有任何圖表並不意味着什麼。

相關問題