內存泄漏(Memory Leak)是指程序中己動態分配的堆內存因爲某種緣由程序未釋放或沒法釋放,形成系統內存的浪費,致使程序運行速度減慢甚至系統崩潰等嚴重後果。spa
Java中的內存泄露,廣義並通俗的說,就是:再也不會被使用的對象的內存不能被回收,就是內存泄露。對象都是有生命週期的,有的長,有的短,若是長生命週期的對象持有短生命週期的引用,就極可能會出現內存泄露。code
例子:對象
1 public class Simple { 2 Object object; 3 public void method1(){ 4 object = new Object(); 5 //...其餘代碼
6 } 7 }
這裏的object實例,其實咱們指望它只做用於method1()方法中,且其餘地方不會再用到它,可是,當method1()方法執行完成後,object對象所分配的內存不會立刻被認爲是能夠被釋放的對象,只有在Simple類建立的對象被釋放後纔會被釋放,嚴格的說,這就是一種內存泄露。解決方法就是將object做爲method1()方法中的局部變量,或者,在method其餘代碼以後執行object = null。blog
預防內存泄露的原則就是儘可能減少對象的做用域,建議是將類的成員變量改寫爲方法內的局部變量)以及手動設置null值。生命週期
Java之LinkedList源碼(JDK 1.8)內存
1 //刪除指定節點並返回被刪除的元素值
2 E unlink(Node<E> x) { 3 //獲取當前值和先後節點
4 final E element = x.item; 5 final Node<E> next = x.next; 6 final Node<E> prev = x.prev; 7 if (prev == null) { 8 first = next; //若是前一個節點爲空(如當前節點爲首節點),後一個節點成爲新的首節點
9 } else { 10 prev.next = next;//若是前一個節點不爲空,那麼他前後指向當前的下一個節點
11 x.prev = null; 12 } 13 if (next == null) { 14 last = prev; //若是後一個節點爲空(如當前節點爲尾節點),當前節點前一個成爲新的尾節點
15 } else { 16 next.prev = prev;//若是後一個節點不爲空,後一個節點向前指向當前的前一個節點
17 x.next = null; 18 } 19 x.item = null; 20 size--; 21 modCount++; 22 return element; 23 }
這段代碼就很是好的將無用變量至null,使得空間得以迅速回收。element
Java之ArrayList源碼(JDK 1.8)作用域
1 public E pop(){ 2 if(size == 0) 3 return null; 4 else
5 return (E) elementData[--size]; 6 }
寫法很簡潔,但這裏卻會形成內存溢出:elementData[size-1]依然持有E類型對象的引用,而且暫時不能被GC回收。咱們能夠以下修改:源碼
1 public E pop(){ 2 if(size == 0) 3 return null; 4 else{ 5 E e = (E) elementData[--size]; 6 elementData[size] = null; 7 return e; 8 } 9 }