import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.WeakHashMap;

public class Ref {

public Ref(){

}

public static void main(String[] args){
try {
// test1();
// test2();
// test3();
// test4();
// test5();
test6();
} catch (InterruptedException e) {
e.printStackTrace();
}

}

/**
* 强引用,JVM的默认实现
* @throws InterruptedException
*/
public static void test1()throws InterruptedException{
Object obj = new Object();
Object strong =obj;

obj =null;
//一个对象具有强引用垃圾机制不会回收它,当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题
System.gc();
Thread.sleep(1000);
System.out.println("strong="+strong);
}

/**
* WeakReference 弱引用 当所引用对象在JVM,内不再强引用是,GC后 weak reference 将会被自动回收
* @throws InterruptedException
*/
public static void test2() throws InterruptedException{
Object obj = new Object();
WeakReference<Object> wr = new WeakReference<Object>(obj);
obj=null;
System.gc();
Thread.sleep(1000);
System.out.println("wr.get()="+wr.get());
System.out.println("wr="+wr);
wr.clear();
System.out.println("w111r="+wr.get());

}

/**
* SoftReference 软引用 SoftReference 于 weakReference 的特性基本一致,最大区别在于
* SoftReference 会尽可能长的保留引用直到JVM 内存不足时才会被回收(虚拟机保证)
* @throws InterruptedException
*/
public static void test3() throws InterruptedException{
Object obj = new Object();
SoftReference<Object> sr = new SoftReference<Object>(obj);
obj=null;
System.gc();
Thread.sleep(1000);
System.out.println("sr.get()="+sr.get());
}

/**
* PhantomReference 虚引用 Phantom Reference 与 WreakReference 和 SoftReference 有
* 很大的不同,因为get()方法永远返回null
* @throws InterruptedException
*/
public static void test4() throws InterruptedException{
Object obj = new Object();
ReferenceQueue<Object> rq = new ReferenceQueue<Object>();
PhantomReference<Object> pr = new PhantomReference<Object>(obj, rq);
System.out.println("pr.get()="+pr.get());
}

/**
* ReferenceQueue
* @throws InterruptedException
*/
public static void test5() throws InterruptedException{

Object obj = new Object();
ReferenceQueue<Object> rq = new ReferenceQueue<Object>();
WeakReference<Object> pr = new WeakReference<Object>(obj, rq);

System.out.println("**pr.enqueue()="+pr.enqueue());
System.out.println("**pr.isEnqueued()="+pr.isEnqueued());
System.out.println("**pr="+pr);
System.out.println("**rq.poll()="+rq.poll());
obj=null;
System.gc();

System.out.println("pr.enqueue()="+pr.enqueue());
System.out.println("**pr.isEnqueued()="+pr.isEnqueued());
System.out.println("pr="+pr);
System.out.println("rq.poll()="+rq.poll());
System.out.println("obj5="+obj);
}

/**
* 使用WeakReference 作为key,一旦没有指向key 的强引用
* weakHashMap 在gc 后将自动删除相关的
* @throws InterruptedException
*/
public static void test6()throws InterruptedException{

Map<Object,Object> map = new WeakHashMap<Object,Object>();
Object key = new Object();
Object value = new Object();
map.put(key,value);
key =null;

System.out.println("value="+value);
System.out.println("key="+key);
System.out.println("map.containsValue(value)="+map.containsValue(value));
System.out.println("map="+map);

System.gc();
Thread.sleep(1000);

System.out.println("value="+value);
System.out.println("key="+key);
System.out.println("map.containsValue(value)="+map.containsValue(value));
System.out.println("map="+map);

}
}转

java的几种引用之二的更多相关文章

  1. Java中四种引用:强、软、弱、虚引用

    这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...

  2. Java 8 的新特性和Java 的4种引用方式

    一.接口的增强 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: interface Formula { double ca ...

  3. Java基础:Java的四种引用

    在Java基础:java虚拟机(JVM)中,我们提到了Java的四种引用.包括:强引用,软引用,弱引用,虚引用.这篇博客将详细的讲解一下这四种引用. 1. 强引用 2. 软引用 3. 弱引用 4. 虚 ...

  4. java的四种引用,强弱软虚和jvm优化

    1.强引用(StrongReference)强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object();   //  强引用 当内存 ...

  5. Java的四种引用方式

    一.引用基本概念 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用.虚引用. 1.强引用(StrongRef ...

  6. Java的四种引用

    1.强引用(StrongReference)强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程 ...

  7. JAVA的四种引用,强弱软虚用到的场景

    1.强引用 最常用的引用类型,如Object object = new Object(),只要强引用存在,GC必定 不回收,即使当前内存空间不足,jAVA虚拟机宁愿抛出OutofMemoryError ...

  8. java 的几种引用

    从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用 本章前文介绍的引用实际上都是强引用, ...

  9. Java虚拟机(五)Java的四种引用级别

    1.前言 HotSpot采取了可达性分析算法用来判断对象是否被能被GC,无论是引用计算法还是可达性分析算法都是判断对象是否存在引用来判断对象是否存活.如果reference类型的数据中存储的数值代表的 ...

随机推荐

  1. POJ 1625 Censored! [AC自动机 高精度]

    Censored! Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 9793   Accepted: 2686 Descrip ...

  2. python装饰器探究与参数的领取

    首先上原文, 现在,假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为"装饰器" ...

  3. 一个.net专业户转Spring Boot V2.0开发的体会

    java web的idea开发工具总体用起来还是比vs差很多,但是在使用Hibernate跟MyBatis的感触,Hibernate有着.net core ef没有的细腻,Hibernate在细节上完 ...

  4. shell编程之运算符(3)

    declare声明变量类型 declare[+/-][选项]变量名 选项: - : 给变量设定类型属性 + : 取消变量的类型属性 -a : 将变量声明为数组型 -i : 将变量声明为整数型(inte ...

  5. ansible 检查大量客户端的文件与配置情况

    ansible pro_adservers -m command -a 'w' ansible pro_adservers -m command -a 'hostname' ansible pro_a ...

  6. Python面向对象篇(3)-封装、多态、反射及描述符

    1. 多态 多态,最浅显的意识就是同一事物具有多种形态,这很好理解,动物是一个大类,猫类属于动物类,狗类属于动物类,人也是属于动物类,那能理解成,猫.狗.人是一样的吗?当然不是,还有,水,分为液体.固 ...

  7. LaTeX 各种命令,符号

    函数.符号及特殊字符 声调 语法 效果 语法 效果 语法 效果 \bar{x} \acute{\eta} \check{\alpha} \grave{\eta} \breve{a} \ddot{y} ...

  8. git使用步骤

    1报名出处: git config --global user.name lhp  用户名 git config --global user.email a@.qq.com 邮箱 2.建立项目文件夹: ...

  9. 解决react-router4在browserhistory路由下的nginx的白屏或者404问题

    使用react-router,官方推荐用browserhistory,美观简洁.但是nginx服务器端的配置也让人头疼. 首先看官方举例的方法: server { location / { try_f ...

  10. C语言_简单了解一下typedef

    作为一名PHPer,了解一下C还是有必要的,只是做一个简单的了解,因为并没有做开发C的想法. 关于typedef的详细说明,网上搜过了很多帖子,这篇算是最详细的了:http://blog.csdn.n ...