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. [Python Study Notes] 抉择--Python2.x Or Python 3.x

    In summary : Python 2.x is legacy, Python 3.x is the present and future of the language Python 3.0 w ...

  2. 打通MySQL的操作权限

    打通MySQL的操作权限 前面已经总结了<XAMPP的配置与使用>,虽然可以直接通过GUI控制面板去启动MySQL服务,但是有些相关的操作则需要在Windows中的CMD命令窗口中去对My ...

  3. mac攻略(4) -- 使用brew配置php7开发环境(mac+php+apache+mysql+redis)

    [http://www.cnblogs.com/redirect/p/6131751.html] 网上有很多文章都是错误的,因为是copy别人的,作者没有自己亲测,不仅不能给新手提供帮助,还会产生严重 ...

  4. Linux下绝对经典的命令

    1.使用远程终端时,可以使用如下命令: screen tmux 2.下载文件可以使用如下命令: curl wget 3.压缩解压缩可以使用: tar .zip.rar 4.使用抓包工具 tcpdump ...

  5. 【Unity3D技术文档翻译】第1.1篇 AssetBundle 工作流

    译者前言:本章是关于从创建到加载,再到使用 AssetBundle 的整个流程的概述.阅读本章将对 AssetBundle 的工作流程有个简单而全面的了解. 本章原文所在章节:[Unity Manua ...

  6. Oracle中的多表查询(笛卡尔积原理)

    本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: 3. 子查询的操作,并且结合限定查询.数据排序.多表查询.统计查询一起完成各个复杂查询的操作: 一 ...

  7. Nginx和php是怎么通信的?

    先来看一下搭建好PHP运行环境的Nginx配置文件. 非常重要的就是 fastcgi_pass 指令了,这个指令用于指定 fpm 进程监听的地址,Nginx 会把所有的 php 请求翻译成 fastc ...

  8. iOS 点击屏幕空白区隐藏键盘方法

    iOS开发中,经常要用到输入框,可默认情况下,输入框出来之后,除非点击键盘上面的“Done”或“Next”按钮才能将其隐藏.站在用户体验的角度上看,这种情况很不友好,尤其是不能突显苹果操作的便捷性. ...

  9. UVA - 1592 Database 枚举+map

    思路 直接枚举两列,然后枚举每一行用map依次记录每对字符串出现的是否出现过(字符串最好先处理成数字,这样会更快),如果出现就是"NO",否则就是"YES". ...

  10. nyoj222 整数中的1 数位DP

    从a枚举到b是一定会超时的.此题应该考虑数位dp,也可以理解为递推,假设给定数n,就能在O(32)复杂度算出所有小于等于n的数中1出现的次数,那么给定区间[a, b],solve(b) - solve ...