引用及应用(Reference\WeakHashMap)十六

import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;


/**
 * 引用的四大类型:强、软、弱、虚
 * 1)强引用:StrongReference,引用指向对象,gc(Garbage collection)运行时
 *  不回收。
 * 2)软引用:SoftReference gc运行时可能回收(jvm内存不够)
 * 3)弱引用:WeakReference gc运行时立即回收
 * 4)虚引用:PhantomReference 类似于无引用,主要跟踪对象被回收的状态,不能单独使用,
 *   必须与引用队列(ReferenceQueue)联合使用
 *   
 * 目的:避免对象长时间驻留内存,解决垃圾回收机制时间问题。
 * 
 * WeakHashMap
 * 键为弱引用,回收键后自动删除 key-value对象。
 */
public class ReferenceTest {
public static void main(String[] args) {
System.out.println("内存为null,表示已经释放回收");
testStrong();
System.out.println("======================");
testWeak();
System.out.println("======================");
testSoft();
System.out.println("======================");
testWeakHashMap();
}

/**
*  StrongReference 是 Java的默认引用实现,它会尽可能长时间的存活于 JVM内,
*   当没有任何对象指向它时 GC 执行后将会被回收
*/
static void testStrong(){
Object strong=new Object();
//通过赋值创建强引用:直接引用
Object strongReference=strong;
strong=null;

System.gc();
System.out.println(strongReference);
}
//====================================
static void testWeak(){
Object weak=new Object();
WeakReference<Object> wrf=new WeakReference<Object>(weak);
//===================
String str="共享的常量值,住在-堆内存常量池";
WeakReference<Object> wrf1=new WeakReference<Object>(str);


weak=null;
str=null;

System.gc();
System.runFinalization();
System.out.println("回收:"+wrf.get());
System.out.println("常量池对象不回收:"+wrf1.get());


}
//=====================================
static void testSoft(){
Object soft=new Object();
SoftReference<Object> srf=new SoftReference<Object>(soft);

soft=null;
System.gc();
System.runFinalization();
System.out.println(srf.get());
}
//============WeakHashMap==============
static void testWeakHashMap(){
WeakHashMap<String,String> map=new WeakHashMap<String,String>();
//常量池对象,不回收
map.put("a", "A");
map.put("b", "B");
//回收
map.put(new String("c"), "c");
map.put(new String("d"), "d");

System.gc();
System.runFinalization();
System.out.println(map.size());
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值