大家讲道理2017-04-18 10:51:43
一般來說,Java中的記憶體洩漏指的是已經不再被程式需要的已分配記憶體無法被回收。
垃圾回收機制透過物件與Root物件的可及性判斷記憶體是否可以被回收,但由於程式錯誤或其他原因,導致過期的物件參考仍然被持有,垃圾回收器無法回收相關空間。
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的,不用程式設計師過多干涉,但是由於一些錯誤操作,導致一些本來不在需要使用的物件仍然有引用,才會導致記憶體洩漏的。