2015-05-25 14 views
2

當我得到OOM錯誤時,如何決定天氣我應該增加堆大小還是存在內存泄漏問題?在JVM中如何定義內存泄漏?

另外,如何決定我的應用程序的初始堆大小?在我目前的應用程序中,我們已經開始使用512MB,但現在已增加到4GB。但是這是通過試錯法完成的。有沒有系統的方法來決定所需的堆大小?

如果我的問題聽起來太基本了,任何人都可以請分享一些可以幫助增進對此的理解的參考嗎?

+0

就是這樣。使用VisuamVM進行配置以查看正在使用多少內存。在測試環境中增加負載運行它。配置文件,測試,配置文件等 –

+1

這是一篇好文章:http://www.toptal.com/java/hunting-memory-leaks-in-java使用堆轉儲來檢測哪個類有多個實例的部分可能會導致哪些類泄漏:http://stackoverflow.com/questions/2511315/method-for-finding-memory-leak-in-large-java-heap-dumps –

回答

2

我不認爲Java或JVM實際上定義了「泄漏」。但是你的程序顯然受到它們的影響。我確定他們定義了「內存不足」。

如果存在永遠不會由應用程序再次檢查的對象,由永遠不會退出的作用域中的引用持有的對象或由偶爾檢查的另一個對象持有的對象,則存在內存泄漏。這種泄漏可能不會嚴重影響程序的長期穩定性。

如果在運行應用程序中的一些代碼時生成具有這些屬性的新對象,並且該位代碼可能運行的次數不確定,那麼您的泄漏就會很糟糕。最終,泄漏不良的程序耗盡內存。

2

在我看來,'泄漏'在GC環境中是一個糟糕的術語。泄漏正是垃圾收集。

什麼也不會GC'd,以及是什麼原因導致OutOfMemoryErrors,是內存泄露時,是應該的,即舉行超出它本身的使用壽命的對象,通常是一個成員變量的引用引用這應該是方法本地的。