提到弱引用和軟引用,想到內存的動態分配與內存回收。在Java語言中,有的區域的內存分配和回收都具有肯定性(好比:程序計數器、虛擬機棧和本地方法棧),它們不須要考慮過多的回收問題;而有的區域的內存分配和回收都是動態的(好比,Java堆和方法區、一個接口的多個實現類須要的內存可能不同)。垃圾收集器對堆進行回收的條件取決於指向該對象的引用類型。緩存
Java中有以下四種類型的引用:
①強引用(Strong Reference)
拋出 OutOfMemoryError也不會回收被強引用關聯的對象。
②軟引用(SoftReference)
若是一個對象只具備軟引用,內存空間足夠,垃圾回收器就不會回收它;若是內存空間不足了(在虛擬機拋出 OutOfMemoryError 以前),就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就能夠被程序使用。
軟引用對象最經常使用於實現內存敏感的緩存。
③弱引用(WeakReference)
只具備弱引用的對象擁有更短暫的生命週期。強度比軟引用更弱一些,被弱引用關聯的對象只能生存到下一次垃圾收集發生以前,一經發現,無論當前內存空間足夠與否,都會回收它的內存。
例如:WeakHashMap類,它的key 採用了弱引用的方式,即以弱鍵實現的基於哈希表的 Map。在WeakHashMap中,當某個鍵再也不正常使用時,將自動移除其條目,所以可以節約存儲空間,可用來緩存那些非必須存在的數據。
④虛引用(PhantomReference)
形同虛設。
總之,合理的使用引用才能夠給垃圾回收器助力。對象