2016-09-14 20 views
-1

我可以從GC日誌中看到,使用堆的內存正在穩步增加,完整的GC永遠不會發生,就像在一天內說過一次一樣。該應用程序尚未崩潰。我應該尋找什麼?任何指針都會非常有幫助。我在Linux機器上運行Java 7。爲什麼我的堆會穩定增長並且完整的GC永遠不會發生?

+1

它只在必要時執行完整的GC。如果它沒有執行完整的GC,那麼您沒有給出它這樣做的理由。 –

+0

你有沒有內存泄漏或什麼地方? – EJoshuaS

+0

職稱生成GC稱爲Major,Full GC正在清理整個堆,您可能仍然在堆中有空閒內存。而應關注主要GC發生的頻率以及停止世界停頓的時間。 –

回答

0

Java進程內存包括JVM內存空間(堆+其他區域)和非JVM內存(如果您在JVM中使用某些本機庫)。

通常情況下,堆永遠不會推卸 - 內存可以被JVM重用,但不會釋放到操作系統(這取決於GC算法)。

JVM有兩個選項來控制堆大小-Xms-Xmx,它們設置了堆的初始大小和最大可能值(actually a bit more than 2 options)。

不斷增長的進程​​內存佔用可能或可能不是內存泄漏的指示。

您需要在JVM中啓用GC日誌記錄或使用某些JVM工具(例如JVisualVM)來驗證您的活動對象羣體是否正在增長。

Java中的內存泄漏通常表現爲「完整GC」事件序列,並且間隔減少。

您不應期望JVM垃圾回收器將內存釋放回操作系統。有些算法無法做到。有些(如G1)可以,但他們可能有理由不立即做。

相關問題