面试题(五)强引用、软引用、弱引用、虚引用分别是什么?

引用的组织架构图

 

一:强引用(死了都不进行回收)。

(1)当内存不足,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,死都不收。

(2)强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象,在java中最常见的就是强引用。把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到JVM也不会回收。因此强引用是造成java内存泄漏的主要原因之一。

(3)对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显示的将相应(强)引用赋值为null,一般认为就是可以被垃圾收集的(当然具体回收时机还是要看垃圾收集策略)。

 

强引用演示代码

package com.mszl.gc;
/**
 * 功能:强引用
 * 备注:更多资料请访问 http://www.91mszl.com
 * @author bobo teacher
 */
public class ReferenceDemo1 {
	
	public static void main(String[] args) {
		Object obj1=new Object(); // 这样的写法就是强引用
		Object obj2=obj1; // obj2 引用赋值
		obj1=null;
		System.gc();
		
		System.out.println(obj1);
		System.out.println(obj2);
	}
	
	
}

执行结果

null
java.lang.Object@1db9742

 

二:弱引用(在系统内存充足的情况下不进行回收,系统内存不够的时候进行回收)

(1)软引用是一种相对强引用弱化了一些引用,需要用java.lang.ref.SoftReference类实现,可以让对象豁免一些垃圾收集。

(2)对于只有软引用的对象来说,当系统内存充足时不会被回收,当系统内存不足时会被回收。

(3)软引用通常在堆内存敏感的程序中,比如高速缓存就有用到软引用,内存够用的时候就保留,不够用就回收。

 

软引用内存充足的情况演示,代码如下

package com.mszl.gc;

import java.lang.ref.SoftReference;

/**
 * 功能:软引用
 * 备注:更多资料请访问 http://www.91mszl.com
 * @author bobo teacher
 */
public class ReferenceDemo2 {

	// 内存充足
	public static void memoryEnough(){
		Object obj=new Object();
		SoftReference<Object> sf=new SoftReference<Object>(obj);
		System.out.println(obj);
		System.out.println(sf.get());
		
		obj=null;
		System.gc();
		
		System.out.println(obj);
		System.out.println(sf.get());
	}
	
	public static void main(String[] args) {
		memoryEnough();
	}

}

执行结果

java.lang.Object@1db9742
java.lang.Object@1db9742
null
java.lang.Object@1db9742

 

软引用内存不足的情况演示,代码如下

package com.mszl.gc;

import java.lang.ref.SoftReference;

/**
 * 功能:软引用
 * 备注:更多资料请访问 http://www.91mszl.com
 * @author bobo teacher
 */
public class ReferenceDemo2 {

	// 内存不足:我们eclipse设置为 -Xms10m -Xmx10m
	public static void memoryNotEnough(){
		Object obj=new Object();
		SoftReference<Object> sf=new SoftReference<Object>(obj);
		System.out.println(obj);
		System.out.println(sf.get());
		
		obj=null;
		try{
			byte[] bt=new byte[30 * 1024 * 1024];
		} catch(Exception ex){
			ex.printStackTrace();
		} finally{
			System.out.println(obj);
			System.out.println(sf.get());
		}
	}
	
	public static void main(String[] args) {
		memoryNotEnough();
	}

}

执行结果

java.lang.Object@1db9742
java.lang.Object@1db9742
null
null
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at com.mszl.gc.ReferenceDemo2.memoryNotEnough(ReferenceDemo2.java:21)
	at com.mszl.gc.ReferenceDemo2.main(ReferenceDemo2.java:31)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值