java中的SoftReference和WeakReference已經出來很久了,但是到現在爲止開發的程序裏幾乎都沒有直接用到它們。
用不到,那就說明還沒有碰到需要用它們的場景,當然也有一個原因,就是不知道怎麼用。
簡單來說,java中的引用默認都是強引用,只要當引用存在(就是能從根引用遍歷到),GC就不會回收。
有時候,我們無法自己決定還要不要用一個實例,可能需要根據情況決定,那麼就有了SoftReference和WeakReference。
SoftReference:當jvm內存不夠用的時候,由jvm決定是否回收
WeakReference:無條件回收。
對於SoftReference,我們很自然的就想到了一個應用,那就是cache,cache裏的東西當然是存在的時間越長越好,但是畢竟有內存的限制,既然我們不知道什麼時候內存不夠用,那麼就把控制權交個jvm,jvm覺得內存不夠用了,那麼就去清理一下SoftReference裏的對象
對於WeakReference,只能想到一個應用場景,那就是,類A裏引用了類B裏的一個field實例,目的就是爲了當類B以及其成員沒被GC是,想在類A的方法裏對這個field進行操作,如果已經GC了,那麼就什麼都不做。
比如:一個異步請求返回數據時,去更新頁面A裏的表格,就可以在請求類裏保持一個對頁面A裏表格的一個WeakReference,如果在請求還未返回的時候,頁面A已經關掉了的話,也不影響表格的釋放。頁面A沒關掉的話,就可以直接更新了。