最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java弱引用(WeakReference)的理解與使用

 更新時(shí)間:2019年04月01日 08:45:31   作者:零度anngle  
這篇文章主要介紹了Java弱引用(WeakReference)的理解與使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

看到篇帖子, 國(guó)外一個(gè)技術(shù)面試官在面試senior java developer的時(shí)候, 問到一個(gè)weak reference相關(guān)的問題. 他沒有期望有人能夠完整解釋清楚weak reference是什么, 怎么用, 只是期望有人能夠提到這個(gè)concept和java的GC相關(guān). 很可惜的是, 20多個(gè)擁有5年以上java開發(fā)經(jīng)驗(yàn)的面試者中, 只有兩人知道weak reference的存在, 而其中只有一人實(shí)際用到過他. 無疑, 在interviewer眼中, 對(duì)于weak reference的理解和應(yīng)用在面試中給了這一個(gè)interviewee相當(dāng)多的加分.  所以, 將我對(duì)于這個(gè)技術(shù)的理解和使用總結(jié)在這篇博客里, 希望讀者和自己通過讀和寫這篇帖子, 能夠在以后的工作和面試中獲得加分.

在Java里, 當(dāng)一個(gè)對(duì)象o被創(chuàng)建時(shí), 它被放在Heap里. 當(dāng)GC運(yùn)行的時(shí)候, 如果發(fā)現(xiàn)沒有任何引用指向o, o就會(huì)被回收以騰出內(nèi)存空間. 或者換句話說, 一個(gè)對(duì)象被回收, 必須滿足兩個(gè)條件: 1)沒有任何引用指向它 2)GC被運(yùn)行.

在現(xiàn)實(shí)情況寫代碼的時(shí)候, 我們往往通過把所有指向某個(gè)對(duì)象的referece置空來保證這個(gè)對(duì)象在下次GC運(yùn)行的時(shí)候被回收 (可以用java -verbose:gc來觀察gc的行為)

Object c = new Car();
c=null;

但是, 手動(dòng)置空對(duì)象對(duì)于程序員來說, 是一件繁瑣且違背自動(dòng)回收的理念的.  對(duì)于簡(jiǎn)單的情況, 手動(dòng)置空是不需要程序員來做的, 因?yàn)樵趈ava中, 對(duì)于簡(jiǎn)單對(duì)象, 當(dāng)調(diào)用它的方法執(zhí)行完畢后, 指向它的引用會(huì)被從stack中popup, 所以他就能在下一次GC執(zhí)行時(shí)被回收了.

但是, 也有特殊例外. 當(dāng)使用cache的時(shí)候, 由于cache的對(duì)象正是程序運(yùn)行需要的, 那么只要程序正在運(yùn)行, cache中的引用就不會(huì)被GC給(或者說, cache中的reference擁有了和主程序一樣的life cycle). 那么隨著cache中的reference越來越多, GC無法回收的object也越來越多, 無法被自動(dòng)回收. 當(dāng)這些object需要被回收時(shí), 回收這些object的任務(wù)只有交給程序編寫者了. 然而這卻違背了GC的本質(zhì)(自動(dòng)回收可以回收的objects).

所以, java中引入了weak reference. 相對(duì)于前面舉例中的strong reference:

Object c = new Car(); //只要c還指向car object, car object就不會(huì)被回收

 當(dāng)一個(gè)對(duì)象僅僅被weak reference指向, 而沒有任何其他strong reference指向的時(shí)候, 如果GC運(yùn)行, 那么這個(gè)對(duì)象就會(huì)被回收. weak reference的語法是:

WeakReference<Car> weakCar = new WeakReference(Car)(car);

 當(dāng)要獲得weak reference引用的object時(shí), 首先需要判斷它是否已經(jīng)被回收:

weakCar.get();

 如果此方法為空, 那么說明weakCar指向的對(duì)象已經(jīng)被回收了.

下面來看一個(gè)例子:

package weakreference;
/**
 * @author wison
 */
public class Car {
	private double price;
	private String colour;
	
	public Car(double price, String colour){
		this.price = price;
		this.colour = colour;
	}
	
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public String getColour() {
		return colour;
	}
	public void setColour(String colour) {
		this.colour = colour;
	}
	
	public String toString(){
		return colour +"car costs $"+price;
	}
	
}
package weakreference;

import java.lang.ref.WeakReference;

/**
 * @author wison
 */
public class TestWeakReference {

	
	public static void main(String[] args) {
		
		Car car = new Car(22000,"silver");
		WeakReference<Car> weakCar = new WeakReference<Car>(car);
		int i=0;
		while(true){
			if(weakCar.get()!=null){
				i++;
				System.out.println("Object is alive for "+i+" loops - "+weakCar);
			}else{
				System.out.println("Object has been collected.");
				break;
			}
		}
	}

}

在上例中, 程序運(yùn)行一段時(shí)間后, 程序打印出"Object has been collected." 說明, weak reference指向的對(duì)象的被回收了.

值得注意的一點(diǎn) , 即使有 car 引用指向?qū)ο? 且 car 是一個(gè)strong reference, weak reference weakCar指向的對(duì)象仍然被回收了. 這是因?yàn)閖ava的編譯器在發(fā)現(xiàn)進(jìn)入while循環(huán)之后, car 已經(jīng)沒有被使用了, 所以進(jìn)行了優(yōu)化(將其置空?). 當(dāng)把TestWeakReference.java修改為:

package weakreference;

import java.lang.ref.WeakReference;

/**
 * @author wison
 */
public class TestWeakReference {

	public static void main(String[] args) {
		
		Car car = new Car(22000,"silver");
		WeakReference<Car> weakCar = new WeakReference<Car>(car);
		
		int i=0;
		
		while(true){
			System.out.println("here is the strong reference 'car' "+car);
			if(weakCar.get()!=null){
				i++;
				System.out.println("Object is alive for "+i+" loops - "+weakCar);
			}else{
				System.out.println("Object has been collected.");
				break;
			}
		}
	}

}

 weak reference指向的object就不會(huì)被回收了. 因?yàn)檫€有一個(gè)strong reference car 指向它.

* WeakReference的一個(gè)特點(diǎn)是它何時(shí)被回收是不可確定的, 因?yàn)檫@是由GC運(yùn)行的不確定性所確定的. 所以, 一般用weak reference引用的對(duì)象是有價(jià)值被cache, 而且很容易被重新被構(gòu)建, 且很消耗內(nèi)存的對(duì)象.

ReferenceQueue

在weak reference指向的對(duì)象被回收后, weak reference本身其實(shí)也就沒有用了. java提供了一個(gè)ReferenceQueue來保存這些所指向的對(duì)象已經(jīng)被回收的reference. 用法是在定義WeakReference的時(shí)候?qū)⒁粋€(gè)ReferenceQueue的對(duì)象作為參數(shù)傳入構(gòu)造函數(shù).

其他類型的references

-SoftReference

soft reference和weak reference一樣, 但被GC回收的時(shí)候需要多一個(gè)條件: 當(dāng)系統(tǒng)內(nèi)存不足時(shí)(GC是如何判定系統(tǒng)內(nèi)存不足? 是否有參數(shù)可以配置這個(gè)threshold?), soft reference指向的object才會(huì)被回收. 正因?yàn)橛羞@個(gè)特性, soft reference比weak reference更加適合做cache objects的reference. 因?yàn)樗梢员M可能的retain cached objects, 減少重建他們所需的時(shí)間和消耗.

以上所述是小編給大家介紹的Java弱引用(WeakReference)的理解與使用詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java @Pointcut注解表達(dá)式案例詳解

    Java @Pointcut注解表達(dá)式案例詳解

    這篇文章主要介紹了Java @Pointcut注解表達(dá)式案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java利用PDFBox實(shí)現(xiàn)PDF文檔基本操作

    Java利用PDFBox實(shí)現(xiàn)PDF文檔基本操作

    這篇文章主要為大家詳細(xì)介紹了java如何利用PDFBox實(shí)現(xiàn)PDF文檔基本操作,例如創(chuàng)建PDF文檔、加載PDF文檔、獲取總頁(yè)數(shù)等,需要的小伙伴可以參考下
    2023-11-11
  • java中catalina.home與catalina.base區(qū)別點(diǎn)整理

    java中catalina.home與catalina.base區(qū)別點(diǎn)整理

    在本篇文章里小編給大家整理的是關(guān)于java項(xiàng)目中catalina.home與catalina.base區(qū)別點(diǎn),需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • Java技能點(diǎn)之SimpleDateFormat進(jìn)行日期格式化問題

    Java技能點(diǎn)之SimpleDateFormat進(jìn)行日期格式化問題

    這篇文章主要介紹了Java技能點(diǎn)之SimpleDateFormat進(jìn)行日期格式化問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Springboot接收前端的Json但是為null問題

    Springboot接收前端的Json但是為null問題

    這篇文章主要介紹了Springboot接收前端的Json但是為null問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教<BR>
    2024-05-05
  • 使用SpringBoot代碼詳細(xì)解釋<List>的用法

    使用SpringBoot代碼詳細(xì)解釋<List>的用法

    List是Java集合框架中的一種數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)一組有序的元素,使用List可以方便地向其中添加、刪除或者修改元素,也可以通過下標(biāo)或者迭代器遍歷其中的元素,這篇文章主要介紹了用SpringBoot代碼詳細(xì)解釋<List>的用法,需要的朋友可以參考下
    2023-09-09
  • SpringBoot整合JavaMail通過阿里云企業(yè)郵箱發(fā)送郵件的實(shí)現(xiàn)

    SpringBoot整合JavaMail通過阿里云企業(yè)郵箱發(fā)送郵件的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot整合JavaMail通過阿里云企業(yè)郵箱發(fā)送郵件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Idea開發(fā)工具之SpringBoot整合JSP的過程

    Idea開發(fā)工具之SpringBoot整合JSP的過程

    最近在學(xué)習(xí)SpringBoot,看到SpringBoot整合jsp,順帶記錄一下。本文通過圖文實(shí)例相結(jié)合給大家講解SpringBoot整合JSP的過程,感興趣的朋友一起看看吧
    2021-09-09
  • 深入了解Java中Volatile關(guān)鍵字

    深入了解Java中Volatile關(guān)鍵字

    這篇文章主要介紹了Java中Volatile關(guān)鍵字的相關(guān)知識(shí),文章講解非常詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Java 中的io模型詳解

    Java 中的io模型詳解

    這篇文章主要介紹了Java 中io模型的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-04-04

最新評(píng)論

樟树市| 广元市| 开江县| 武邑县| 玛曲县| 红原县| 蒙自县| 昌江| 津南区| 吐鲁番市| 杭锦后旗| 沁源县| 鹿泉市| 禄劝| 泸西县| 泉州市| 临清市| 嵊州市| 东宁县| 乐都县| 光山县| 汉沽区| 大渡口区| 大石桥市| 沙田区| 安陆市| 南涧| 健康| 凯里市| 汾西县| 淮滨县| 读书| 登封市| 商南县| 塔河县| 思南县| 宽甸| 湘潭市| 若羌县| 瓦房店市| 远安县|