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());
}
}
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());
}
}