java中强,软,弱,虚引用  以及WeakHahMap
 
一:强软引用:
 
package reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.util.WeakHashMap;
public class ReferenceObject {
     public static void main(String[] args) {
           //strongToSoft();
           softReferenceToReferenceQueue();
     }
     /**
      * 强引用转软引用
      * 执行完代码1,可知Student这个对象被'变量'strongRef强引用
      * 执行完代码2,可知Student这个对象被'SoftReference对象'softRef软引用
      * 此时有两条引用引用路径(根据对象可及性的判断,单条引用路径取最弱的一个引用决定对象的可及性,多条引用路径取最强的一条的引用决定对象的可及性)
      * 所以此时的Student对象为强引用
      * 执行完代码3,只剩一条引用路径,所以此时是软引用的
      * 执行完代码4,通过软引用对象的get方法把Student这个对象转回强引用给anotherStrongRef变量上
      * 此时的anotherStrongRef变量引用的地址还是和之前strongRef变量的地址是一样的.其实strongRef,softRef,anotherStrongRef指向堆内存地址都是一样的
      * 只不过softRef是在软引用对象里再引用了Student对象信息,即对象里包含对象
      * 如果softRef因内存不足而回收之后,调用get()方法就只能得到null了。
      */
     public static void strongToSoft(){
           Student strongRef = new Student(1, "chenyong");// 1,强引用
           System.out.println("最初的强引用:"+strongRef+",hashCode:"+strongRef.hashCode());
           SoftReference<Student> softRef = new SoftReference(strongRef);// 2,软引用
           strongRef = null;// 3
           System.out.println("软引用:"+softRef);
           Object anotherStrongRef = softRef.get();// 4
           System.out.println("软引用转变的强引用:"+anotherStrongRef+",hashCode:"+anotherStrongRef.hashCode());
     }
     /**软引用对象到引用队列
      * 代码2处创建一个引用队列,用于给到代码3的机构方法中,SoftReference的机构方法有2种,带队列的与不带队列的
      * 此处加上引用队列,用于对软引用对象的引用对象因内存不足而清楚后把该软引用对象加入到引用队列中
      * 即当强引用strongRef被清除后,软引用softRef因内存不足导致所引用的strongRef也被清除,最后把软引用本身softRef加入到引用队列
      * 代码5处通过队列的poll()方法返回队列的第一个软引用对象
      * 可以再代码6中对软引用对象进行清除
      */
     public static void softReferenceToReferenceQueue(){
           Student strongRef = new Student(2, "chenben");// 1,强引用
           System.err.println("最初的强引用:"+strongRef+",hashCode:"+strongRef.hashCode());
           ReferenceQueue queue = new ReferenceQueue<>();// 2,创建引用队列
           SoftReference<Student> softRef = new SoftReference(strongRef,queue);// 3,添加引用队列的软引用
           strongRef = null;// 4
           System.err.println("软引用:"+softRef);
           System.err.println("引用队列的第一个软引用对象:"+queue.poll());// 5
           //利用队列消除软引用对象
           SoftReference softObject ;
           while((softObject = (SoftReference) queue.poll()) != null){
                // 6  清除softObject
           }
           
     }
     /**
      * 在Java集合中有一种特殊的Map类型—WeakHashMap,
      * 在这种Map中存放了键对象的弱引用,当一个键对象被垃圾回收器回收时,那么相应的值对象的引用会从Map中删除。
      * WeakHashMap能够节约存储空间,可用来缓存那些非必须存在的数据。关于Map接口的一般用法。
      */
     public static void useWeakHashMap(){
           WeakHashMap map = new WeakHashMap();
     }
}
 
二:WeakHahMap与弱引用
 
package reference;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
/**
 * 普通HashMap和WeakHahMap区别
 * @author t433
 *
 */
public class WeakHashMapTest {
 
    public static void main(String[] args) {
        storeToOrdernaryMap();
        storeToweakHashMap();
    }
/**
 * 普通HashMap存储数据时,存储的都是强引用类型的,并不会因为内存不足而回收对象
 * 所以内存会因为不足导致 java.lang.OutOfMemoryError: Java heap space
 * 在抛出异常前map存储的第一个数据都会一直存在,并不会清楚之前存储的数据
 *
 * 注:在代码1处i对后面的数字取模时,假如数字较小时,要导致OutOfMemoryError需要的时间更长,
 * 因为数字较小时在单位时间内程序进入if里面执行打印的次数较多,而进行map存放的次数较小    ,所以需要更长的时间来执行map.put()
 *
 */
public static void storeToOrdernaryMap(){
    Map<String, String> map = new HashMap<String, String>(); 
    long i = 1;
    while (i < 100000000L) { 
        map.put(String.valueOf(i),"java-HashMap-java"); 
        // 测试第一个是否依然存活 
       if (i % 100000 == 0) {// 1 
            System.out.println("第"+i+"次判断普通HahMap的第1个map的值:"+map.get(String.valueOf(1)));// 大概在 3000000次时抛出异常
        }
        i++; 
    }
}
/**
 * WeakHashMap将弱引用作为内部数据的存储方案
 * 弱引用不像 SoftReference 需要条件(软引用对象会在内存不足时被清理,但是内存充足情况下不会清除)
 * WeakHashMap存储的是弱引用对象,当内存不足时会触发垃圾回收器清理,然后垃圾回收器会清除掉弱引用对象
 */
public static void storeToweakHashMap(){
     Map<String, String> map = new WeakHashMap<String, String>(); 
        long i = 1;
        while (i < 100000000L) { 
            map.put(String.valueOf(i),"java-WeakHashMap-java");   
            // 测试第一个是否依然存活 
           if (i % 100000 == 0) { 
               System.out.println("第"+i+"次判断WeakHashMap第1个map的值:"+map.get(String.valueOf(1)));// 3000000
            }
            i++; 
        }
}
 
}
 
 
 
 
 
 
 
 
 
 

java中强,软,弱,虚引用 以及WeakHahMap的更多相关文章

  1. java中的强,软,弱,虚引用

    引用的应用场景 我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型.这正是Java中弱引用和软引用的主要区别. 如果一个对象只有弱引用指向 ...

  2. 一道笔试题来理顺Java中的值传递和引用传递

      题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...

  3. java中的值传递和引用传递有什么区别呀?

    值传递: (形式参数类型是基本数据类型和String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参 ...

  4. Java 中的值传递和引用传递问题

    Java 中的值传递和引用传递问题 public class Operation { int data = 50; void change(int data) { data = data + 100; ...

  5. (转)Java中的值传递和引用传递

    Java中的值传递和引用传递 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?     答:是值传递.Java 编程语言只有值 ...

  6. Java中强、软、弱、虚引用

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

  7. java中的软,弱,虚引用介绍与特性分析

    java的弱,虚,软引用介绍 1.弱,虚,软引用的介绍 对于绝大部分的对象而言,在程序中是存在着一个引用变量引用该对象,这是常见的引用方式,也就是常说的 强引用,对于强引用引用的对象,系统JVM是不会 ...

  8. Java中的软引用、弱引用、虚引用的适用场景以及释放机制

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

  9. java中的软引用,弱引用,虚引用

    http://zh.wikipedia.org/wiki/%E5%BC%B1%E5%BC%95%E7%94%A8 有些语言包含多种强度的弱引用.例如Java,在java.lang.ref[1]包中定义 ...

随机推荐

  1. Git 进阶 —— 远程仓库

    一.远程仓库怎么玩 1. 自己搭建一个运行Git的服务器 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上,但肯定有一台机器有着最原始的版本库,然后别的机器来克隆这个原始版本库,这 ...

  2. 二:mysql安装配置、主从复制配置详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/8213723.html 邮箱:moyi@moyib ...

  3. 浏览器中的user-agent的几种模式

    服务器一般会根据访问的浏览器进行识别,针对不同浏览器才用不同的网站样式及结构,也是通过这个信息判断用户使用的平台模式(手机,pc或平板) 识别为手机一般有这几个关键字: "Windows P ...

  4. 关于recycleview 滑动item变长(item变形)问题

    昨天在做项目的时候出现了bug,表现是在滑动的时候,整个item会被拉长了,松手后就回归正常大小了, 出现这个的主要原因是因为你的item布局中最大的那个根布局是 match_parent状态,因此导 ...

  5. MySQL如何找到表与表之间的关系?

    如何找到两张表之间的关系? 先站在左表的角度上去找,如果可以找到左表的多个字段可以对应右表的一个字段,那么左表的一个字段foregin key右表的一个字段.一般情况下为id... 2.如果右表的多个 ...

  6. Ruby学习之元编程

    Kernel#evel()方法 和Object#instance_evel().Module#class_evel()方法类似,evel()方法也是一个内核方法,Object#instance_eve ...

  7. Head First设计模式之目录

    只有沉淀.积累,才能远航:沉沉浮浮,脚踏实地. 这本书已经闲置了好久,心血来潮,决定写个目录,让自己坚持看完这本书 创建型模式 抽象工厂模式(Abstract factory pattern): 提供 ...

  8. AVFoundation 框架初探究(一)

    夜深时动笔 前面一篇文章写了视频播放的几种基本的方式,算是给这个系列开了一个头,这里面最想说和探究的就是AVFoundation框架,很想把这个框架不敢说是完全理解,但至少想把它弄明白它里面到底有什么 ...

  9. Protobuf使用(一)

    Protobuf使用(一)   前言:   最近由于接手一个支付的项目,他们那边的网络请求和数据解析都与我平常接触的项目不同,数据请求由于保密暂时不能说,但是数据解析用的是Protobuf,于是我就顺 ...

  10. HTTPS、证书与使用Charles抓包

    .p1 { margin: 0.0px 0.0px 0.0px 0.0px; font-size: 14.0px; font-family: "Helvetica Neue", & ...