亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“java.lang.OutOfMemoryError:GC 開銷限制超出”是否表示內存泄漏?

“java.lang.OutOfMemoryError:GC 開銷限制超出”是否表示內存泄漏?

翻閱古今 2021-06-20 18:10:55
我正在了解有關內存泄漏的更多信息,并嘗試使用以下代碼:我有下面的代碼拋出 Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"import com.learn.general.memoryleaks.LeakFactory.Leak;public class InnerClassMemoryLeakTest {    static Leak[] leaks = new Leak[100000];    public static void main(String[] args) {        while(true) {            for (int i = 0; i < leaks.length; i++) {                leaks[i] = new LeakFactory().getLeak();            }        }    }    private static void createLeak() {        while(true) {            for (int i = 0; i < leaks.length; i++) {                leaks[i] = new LeakFactory().getLeak();            }        }    }}import java.util.Calendar;public class LeakFactory {    double d = Math.random();    Calendar calendar = Calendar.getInstance();    public Leak getLeak(){        return new Leak();    }    public class Leak{        double d_i = Math.random();        Calendar calendar_i = Calendar.getInstance();    }}然后我有下面的代碼拋出 Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceededimport java.util.ArrayList;import java.util.Calendar;import java.util.List;public class ArrayListMemoryLeak {    public static void main(String[] args) {        List<Object> calendars = new ArrayList<>();        int count = 0;        while(true){            calendars.add(Calendar.getInstance());        }    }}問題:第一種情況的錯誤是否表示存在內存泄漏,而第二種情況則沒有?
查看完整描述

2 回答

?
慕后森

TA貢獻1802條經驗 獲得超5個贊

根據您的評論:

我正在嘗試了解內存泄漏,所以我正在做的是打算......我正在尋找關于這兩種情況的解釋,以及第一種情況是否表示內存泄漏而第二種情況不

簡單來說,兩個錯誤都表明JVM內存不足,現在JVM是否因為內存泄漏而耗盡內存是另一回事。

現在,來到你的第一個案例 - 是的,存在內存泄漏(盡管是故意的),因為內部類持有封閉類的引用,因此使用創建的對象new LeakFactory()有資格進行 GC,但它們沒有被 GC,因為Leak內部類持有他們。

要更清楚地看到這一點,請更改您的public class Leak{to public static class Leak{,您會注意到 JVM 將運行更長的時間,并且與您原來的非靜態Leak內部類相比,OOM 將在幾秒鐘后出現。


查看完整回答
反對 回復 2021-06-23
?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

內存泄漏是程序員無意中將內存保留的時間超過應有的時間的結果,這種無意的內存使用會慢慢累積,直到沒有任何可分配的內存為止。

在 Java 中,考慮到垃圾收集的性質以及它實際上如何查看對象被引用的強度(或弱),泄漏內存很難做到。

鑒于您必須自己有意識地啟動所有這些類,因此沒有任何關于泄漏的爭論;你是故意這樣做的。您已經創建了足夠多的引用,以至于耗盡了自己的內存限制。

Java 中的內存泄漏通常以比這更狡猾的方式表現出來;一些引用保存在一個finalize()方法中,該方法在類實際被垃圾收集之前不會被釋放,并且只有 VM 知道實際發生的時間(它可能永遠不會發生)。值得慶幸的是,該方法很快就會消失,因此使用方法看到泄漏的可能性至少會降低一點。

您也可能非常邪惡并Unsafe使用該語言做事,但這足以表明大多數明智的 IDE 和工具集會在您手上出現重大內存泄漏之前警告您這種用法。

所有這些都是為了說......不。您看到的異常表明您的內存不足。它并不直接表示內存泄漏。


查看完整回答
反對 回復 2021-06-23
  • 2 回答
  • 0 關注
  • 356 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號