1. 程式人生 > >Effective Java 第二版 中文版 筆記(六)消除過期物件的引用

Effective Java 第二版 中文版 筆記(六)消除過期物件的引用

這部分沒有怎麼理解,但總體的意思就是防止記憶體洩漏

Java的垃圾回收機制:

Java中的物件是在堆中分配,物件的建立有2中方式:new或者反射。物件的回收是通過垃圾收集器,JVM的垃圾收集器簡化了程式設計師的工作,但是卻加重了JVM的工作,這是Java程式執行稍慢的原因之一,因為GC為了能正確釋放物件,必須監控每一個物件的執行狀態,包括物件的申請、引用、被引用、賦值等,GC都要進行監控,監控物件的狀態是為了更加準確、及時地釋放物件,而釋放物件的根本原則就是該物件不再被引用。

記憶體洩漏的幾種情形

a. 類是自己管理記憶體的,比如我們上面所舉的stack的例子,對於這種情況,一旦元素被釋放掉了,則該元素中包含的任何物件引用都應該被清空。

b. 記憶體洩漏的另一個常見來源是快取。一旦你把物件引用放到快取中,它就很容易被遺忘掉,從而使得它不再有用之後很長一段時間內仍然留在快取中。解決方法是使用WeakHashMap

Map<String,Object> map = new WeakHashMap<String,Objecct>();

c. 記憶體洩漏的第三個常見來源是監聽器和其他回撥。如果你實現了一個API,客戶端在這個API中註冊呼叫,卻沒有顯式地取消註冊,那麼除非你採取某些措施,否則它們就會積聚。解決方法為確保回撥立即當作垃圾回收的最佳方法是隻儲存它們的弱引用。

List<String> list = new ArrayList<>();
String str = "java";
list.add(str);
str  = null;

那麼對於之前的list的例子,我們可以通過list.remove(str)或者list = null方法來刪除對空間的引用,從而使得垃圾回收器可以回收到該記憶體空間。