2 回答

TA貢獻1802條經驗 獲得超5個贊
根據您的評論:
我正在嘗試了解內存泄漏,所以我正在做的是打算......我正在尋找關于這兩種情況的解釋,以及第一種情況是否表示內存泄漏而第二種情況不
簡單來說,兩個錯誤都表明JVM內存不足,現在JVM是否因為內存泄漏而耗盡內存是另一回事。
現在,來到你的第一個案例 - 是的,存在內存泄漏(盡管是故意的),因為內部類持有封閉類的引用,因此使用創建的對象new LeakFactory()
有資格進行 GC,但它們沒有被 GC,因為Leak
內部類持有他們。
要更清楚地看到這一點,請更改您的public class Leak{
to public static class Leak{
,您會注意到 JVM 將運行更長的時間,并且與您原來的非靜態Leak
內部類相比,OOM 將在幾秒鐘后出現。

TA貢獻1876條經驗 獲得超6個贊
內存泄漏是程序員無意中將內存保留的時間超過應有的時間的結果,這種無意的內存使用會慢慢累積,直到沒有任何可分配的內存為止。
在 Java 中,考慮到垃圾收集的性質以及它實際上如何查看對象被引用的強度(或弱),泄漏內存很難做到。
鑒于您必須自己有意識地啟動所有這些類,因此沒有任何關于泄漏的爭論;你是故意這樣做的。您已經創建了足夠多的引用,以至于耗盡了自己的內存限制。
Java 中的內存泄漏通常以比這更狡猾的方式表現出來;一些引用保存在一個finalize()
方法中,該方法在類實際被垃圾收集之前不會被釋放,并且只有 VM 知道實際發生的時間(它可能永遠不會發生)。值得慶幸的是,該方法很快就會消失,因此使用該方法看到泄漏的可能性至少會降低一點。
您也可能非常邪惡并Unsafe
使用該語言做事,但這足以表明大多數明智的 IDE 和工具集會在您手上出現重大內存泄漏之前警告您這種用法。
所有這些都是為了說......不。您看到的異常表明您的內存不足。它并不直接表示內存泄漏。
添加回答
舉報