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. Visual Representation of SQL Joins

    原文:http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins   从视图上介绍了7种不同类型的JOIN ...

  2. SecureCRT连接本地的Vmware虚拟机(CentOS)时提示连接超时“Connection timed out”

    测试了一下,直接在Vmware的VM里面可以ping通宿主机. 但是宿主机无法ping通VM. 后面发现是本地的网络设置里面的vmware的NAT的网卡设置了手工填写地址和DNS. 修改为自动获取.问 ...

  3. Git详解之四:服务器上的Git

    服务器上的 Git 到目前为止,你应该已经学会了使用 Git 来完成日常工作.然而,如果想与他人合作,还需要一个远程的 Git 仓库.尽管技术上可以从个人的仓库里推送和拉取修改内容,但我们不鼓励这样做 ...

  4. Ajax异步提交登录(2)--登录使用

    http://cjp1989.iteye.com/blog/1740964 1.Ajax的原理: Ajax的原理就是:通过javascript的方式,将前台数据通过xmlhttp对象传递到后台,后台在 ...

  5. 微信小程序开发之scroll-view

    本文主要介绍通过scroll-view实现回至顶部,如下效果 一.页面代码 顶部的工具栏放一个查找按钮,滚动区域实现分页,目的就是为了点击上一页\下一页时,自动回到顶部. scroll-view必须指 ...

  6. 简单搭建ES6的环境

    一.兼容情况 说到ECMAScript6,顺便提一下ECMAScript5,先看一下ES5的兼容情况.ES5浏览器支持情况: Opera 11.60:Internet Explorer 9*:Fire ...

  7. Jenkins 学习笔记(二):很简单的发布一次

    发布思路:从 github 拉取一些文件,然后推送到 Target server 的某个目录. 准备 1. Jenkins 需要安装的插件:『 Publish over SSH 』 2. 全局配置:系 ...

  8. JavaScript、ES5和ES6的介绍和区别

    JavaScript由三部分组成: ECMAScript(核心) DOM(文档对象模型) BOM (浏览器对象模型) ES5(ECMAScript第五个版本) strict模式 严格模式,限制一些用法 ...

  9. MFC中属性表单和向导对话框的使用

    每次在使用MFC创建一个框架时,需要一步步选择自己的程序的外观,基本功能等选项,最后MFC会生成一个基本的程序框架,这个就是向导对话框:而属性表单则是另外一种对话框,表单上有多个属性页,每点击某一页, ...

  10. Virtual Box配置CentOS7网络

    1.先管理中配置两个网络 最好的办法就是使用两块网卡,nat(虚拟机访问互联网,使用10.0.2.x段)和host-only(虚拟机和主机互相通信,使用192.168.56.x段) 2.接下来对Cen ...