2014-04-04 25 views
3

在任何情況下,Java應用程序中的泄漏(例如Tomcat servlet應用程序)是否有可能超出分配的內存並使用額外的系統內存,或者是否爲真正防火牆(可以說)的已分配堆OS /內核內存(的其餘部分)?我正在使用Java 6和7在2.6內核Linux中工作,但這更多的是一個普遍的問題。Java堆內存泄漏是否可能使用比堆+ permgen更多的內存?

+0

是的。除了通過Java堆以外,JVM可以消耗內存的方式有很多種。例如,默認情況下每個線程的堆棧佔用2Mb。如果你描述你看到的問題,也許有人會幫你解決它們。 – kdgregory

+0

這實際上是一個更普遍的問題。我與一些Java開發人員進行了一次電話會議,我建議內存泄漏可能會超出堆的系統內存,而項目的高級開發人員告訴我這是不可能的。我不同意這是不可能的,但我不知道具體情況,我相信我已經看到它發生在過去。 – GL2014

回答

2

是的 - 這是可能的。 Java內存區域被分成幾個區域 - 堆和permgen不是全部。還有代碼緩存和本地內存的區域,這對於所有的堆結構都非常流行。請看第0123張幻燈片的this presentation

+0

該演示文稿看起來很搞笑。喜歡圖片。 – GL2014

1

當然,這是可能的。簡單的例子是ByteBuffer.allocateDirect()FileChannel.map()。這些緩衝區的內容不在Java堆中。