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