前言
java中幾個reference作用,也是面試的時候經(jīng)常問到的問題,以前總是記一次忘一次,現(xiàn)在有時間,索性寫個demo測試一把。下面來一起看看詳細的介紹:
具體代碼如下:
jvm 參數(shù): -xmx10m -xms5m -xx:+printgc
softreference的時候:
weakreference的時候:
strongreference:
由于strong是jvm默認的,這里就不做了,直接就是一點都不會被回收,直至oom
phantomreference:
虛引用并不會改變內(nèi)存回收機制,只是在回收的時候放到referencequeue里通知用戶可做一些額外操作,比如打印日志等
如下代碼,本質(zhì)上byte[]還是一個強引用的。
輸出:
總結(jié)一下:
- strongreference:jvm默認,除非gc時已無任何對象引用,否則即便是oom也不會回收
- weakreference:一旦沒有被引用,gc時就會回收
- softreference:和strong一樣,除非gc時已無任何對象引用,否則....在即將oom前才會被回收,所以softreference一般可以用來做緩存
- sun.nio.ch.util中就有private static threadlocal<softreference<selectorwrapper>> localselector
- = new threadlocal<softreference<selectorwrapper>>();
- 用于臨時的selector。
- phantomreference:通過構(gòu)造函數(shù)的referencequeue作為一個通知,用來在對象被回收時做額外的操作。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。
原文鏈接:http://www.jianshu.com/p/b655387130fd