强、软、弱、虚引用

强引用

代码

public static void main(String[] args){
	Demo d=new Demo();
	d=null;
	System.gc();
}

解析
这里的d就是一个强引用,new Demo()在内存中分配了一块内存,d指向这个内存。当d变为null时,就被系统回收。

软引用

代码

public static void main(String[] args){
	// 创建一个SoftReference对象,一个10m的字节数组。
	// sr对于SoftReference是强引用,SoftReference对于byte数组是软引用。
	SoftReference<byte[]> sr=new SoftReference<>(new byte[1024*1024*10]);
	System.out.println(sr.get());
	System.gc(sr); 
	try{
		Thread.sleep(2000);
	}catch(Exception e){
		e.printStackTrace();
	}
	byte[] arr=new byte[1024*1024*15];
	System.out.println(sr.get());
}

解析
用 -Xmx:20m 将堆的最大内存设置为20m,第一次gc中,不会进行回收,因为此时堆内存够用。第二次gc时,由于创建了强引用arr,大小为15m,所以软引用就被gc了。
使用场景为:缓存。比如缓存中存储一张内存较大的图片,在需要用的时候就调用,不需要的时候,先保存在缓存中,如果缓存需要存储其他更加重要的内容时,就把图片给回收。

弱引用

代码

public static void main(String[] args){
	WeekReference<Demo> d=new WeekReference<>(new Demo());
	System.out.println(d.get());
	System.gc(); 
	System.out.println(d.get());
}

解析
只要调用了gc,弱引用的对象就会被回收。

虚引用

代码

public static void main(String[] args){
	ReferenceQueue<Demo> rq=new ReferenceQueue<>();
	PhantomReference<Demo> pr=new PhantomReference<>(new Demo(),rq);
	System.out.println(pr.get());
}

解析
虚引用需要结合队列来实现,这个虚引用的对象是get不到的,这个队列也不会被干掉。
当系统对一个对象进行gc时,如果这个对象还存在虚引用,就把它放入与之关联的引用队列,第二次进行回收时,如果发现这个对象在队列里面了,就进行回收。
使用场景:用于管理堆外内存(直接内存),实现零拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值