首頁  >  問答  >  主體

既然 Java 的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢

既然 Java 的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢

伊谢尔伦伊谢尔伦2744 天前783

全部回覆(10)我來回復

  • PHP中文网

    PHP中文网2017-04-18 10:51:43

    記憶體資源是有限的,垃圾回收只回收“垃圾”,對於你的程式運行有用的物件不會被回收。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-18 10:51:43

    記憶體溢位分兩種情況:一種是棧溢出,例如呼叫了一個無限遞歸。還有一種是堆溢出,也就是new 出來的物件沒有即使銷毀,例如一直new。

    回覆
    0
  • 黄舟

    黄舟2017-04-18 10:51:43

    因為有些寫的很蠢的程式會在GC機制生效之前無限地創建物件。

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:51:43

    一般來說,Java中的記憶體洩漏指的是已經不再被程式需要的已分配記憶體無法被回收。
    垃圾回收機制透過物件與Root物件的可及性判斷記憶體是否可以被回收,但由於程式錯誤或其他原因,導致過期的物件參考仍然被持有,垃圾回收器無法回收相關空間。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:51:43

    佔茅坑不拉屎,他也沒辦法.
    推薦看下我同事寫的博客:http://blog.csdn.net/zhanggan...

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:51:43

    有些物件其實不需要了但卻一直被引用,沒辦法回收

    回覆
    0
  • PHPz

    PHPz2017-04-18 10:51:43

    就目前來說,人做的東西還不能超越人本身,java的GC演算法是人寫出來的,奈何就有人會作死寫出讓GC無法回收的程式碼來

    回覆
    0
  • 高洛峰

    高洛峰2017-04-18 10:51:43

    這就如同中国那么大,为什么还有人在朝阳区懵逼一樣。

    回覆
    0
  • PHPz

    PHPz2017-04-18 10:51:43

    我自己的理解,說的不對的地方歡迎指正。
    JDK6中,String的一個方法叫subString,這個是用來產生一個子字串的。為了更快速的生成,String有一個建構函數,
    String(int offset, int count, char value[]) {

    this.value = value;
    this.offset = offset;
    this.count = count;

    }
    直接指向了原來String的陣列。我們都知道,每次都會產生一個新的常數池中的String字串。然而這個引用就導致了原來的String無法被回收。因為subString的value會指向他。這裡就會導致內存外洩。

    JVM的確是自己進行GC的,不用程式設計師過多干涉,但是由於一些錯誤操作,導致一些本來不在需要使用的物件仍然有引用,才會導致記憶體洩漏的。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 10:51:43

    JVM:程式設計師抓著垃圾不放,我也很為難啊。

    回覆
    0
  • 取消回覆