Java中的WeakHashMap浅析

 更新时间:2023年09月06日 10:54:48   作者:小布丁value  
这篇文章主要介绍了Java中的WeakHashMap浅析,weakhashmap关键是:当一个对象被GC回收时,响应的值对象的引用从map中删除,weakhashmap能节约存储空间,来实现缓存那些非必要的数据,需要的朋友可以参考下

WeakHashMap介绍

  • weakhashmap优化jvm,是GC更加智能回收无用的对象。
  • weakhashmap关键是:当一个对象被GC回收时,响应的值对象的引用从map中删除,weakhaskmap能节约存储空间,来实现缓存那些非必要的数据

引用类型

java中提供的引用类型有4种

  1. 强(Strong)引用
  2. 软(soft)引用
  3. 弱(weak)引用
  4. 虚( phantom)引用

强(Strong)引用

常使用的引用类型,在创建对象时

在这里插入图片描述

只要强引用存在,GC永远不会回收被引用的对象,通过new创建的对象所关联引用就是强引用,此时GC就不会碰该对象,当jvm内存空间不足,jvm宁愿抛出OOM(OutOfMemoryError)运行时村务,使得程序终止,也不会随时回收强引用所引用的对象 java中除了强引用还有三种引用,在java.lang.ref.Reference

在这里插入图片描述

//referent为引用指向的对象
 Reference(T referent) {
        this(referent, null);
    }
//ReferenceQueue对象,可以理解为队列
    Reference(T referent, ReferenceQueue<? super T> queue) {
        this.referent = referent;
        this.queue = (queue == null) ? ReferenceQueue.NULL : queue;
    }
Object o=new Object();
SoftReferencr sr=new SoftReference(o,queue);

sr为软引用,指向O对象,o会在一定实际被垃圾回收器进行回收,sr对象本身的清理依赖Queue,当sr出现在Queue时,说明指向对象已经无效了,可以放心清理

软(soft)引用

软引用用来处理啊一些有用但非必须对象,对于软引用所作用的对象,当内存空间充足时,如果发生GC操作,软引用所作用的对象是不会被回收的,当空间 不足时,GC操作时软引用所作用的对象才会被回收

public static void softReferenceDemo(){<!--{C}%3C!%2D%2D%20%2D%2D%3E--> Object o = new Object(); ReferenceQueue <Object> referenceQueue = new ReferenceQueue <Object>(); SoftReference <Object> softReference = new SoftReference <Object>(o, referenceQueue); System.out.println(softReference.get()); System.out.println(softReference.isEnqueued()); System.out.println(referenceQueue.poll()); /** * java.lang.Object@4aa594e1 * false * null */ /** * 当对象被回收时,他会放入到referenceQueue实例中 */ //创建比较大的对象,模拟内存不足,触发GC,回收软引用对象 byte[] bytes = new byte[7*1024*1024]; System.gc(); //手动触发GC /** * 理论上空间不足,对象会被回收,队列中会有软引用对象 */ System.out.println(softReference.get()); System.out.println(softReference.isEnqueued()); System.out.println(referenceQueue.poll()); /** * java.lang.Object@4aa594e1 false null 空间充足,未回收 */ } public static void softReferenceDemo(){
        Object o = new Object();
        ReferenceQueue <Object> referenceQueue = new ReferenceQueue <Object>();
        SoftReference <Object> softReference = new SoftReference <Object>(o, referenceQueue);
        System.out.println(softReference.get());
        System.out.println(softReference.isEnqueued());
        System.out.println(referenceQueue.poll());
        /**
         * java.lang.Object@4aa594e1
         * false
         * null
         */
        /**
         * 当对象被回收时,他会放入到referenceQueue实例中
         */
        //创建比较大的对象,模拟内存不足,触发GC,回收软引用对象
        byte[] bytes = new byte[7*1024*1024];
        System.gc(); //手动触发GC
        /**
         * 理论上空间不足,对象会被回收,队列中会有软引用对象
         */
        System.out.println(softReference.get());
        System.out.println(softReference.isEnqueued());
        System.out.println(referenceQueue.poll());
        /**
         *
         java.lang.Object@4aa594e1
         false
         null
         空间充足,未回收
         */
    }

弱(weak)引用

弱引用他的强度会比软引用更弱一些,被软引用所关联的对象,当发生GC操作时,无论当前空间是否充足,都会回收软引用所作用的对象,生命周期会更加短暂

 public static void weakReferenceDemo(){
        Object o = new Object();
        ReferenceQueue <Object> referenceQueue = new ReferenceQueue <Object>();
        WeakReference <Object> weakReference = new WeakReference<Object>(o, referenceQueue);
        System.out.println(weakReference.get());
        System.out.println(weakReference.isEnqueued());
        System.out.println(referenceQueue.poll());
        System.gc(); //手动触发GC
        System.out.println(weakReference.get());
        System.out.println(weakReference.isEnqueued());
        System.out.println(referenceQueue.poll());
    }

weakHashMap实现就是基于弱来实现的

虚引用

虚引用是最弱的引用关系,一个对象是否有虚引用的存在,不会影响对象的声明周期,虚引用存在的目的是当对象被回收时收到一个系统通知

public static void phantomferenceDemo(){
        Object o = new Object();
        ReferenceQueue <Object> referenceQueue = new ReferenceQueue <Object>();
        PhantomReference <Object> phantomReference = new PhantomReference<Object>(o, referenceQueue);
        o = null;
        System.gc(); //手动触发GC
        if (phantomReference.isEnqueued()) {
            System.out.println("正在被回收");
        } else {
            System.out.println("没有被回收");
        }
    }

到此这篇关于Java中的WeakHashMap浅析的文章就介绍到这了,更多相关Java的WeakHashMap内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java集合List和Map互转的方法总结

    Java集合List和Map互转的方法总结

    有时候我们需要将给定的List转换为Map,或者Map转换为List,本文主要介绍了Java集合List和Map互转的方法总结,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 学习Java正则表达式(匹配、替换、查找)

    学习Java正则表达式(匹配、替换、查找)

    这篇文章主要介绍了Java正则表达式的匹配、替换、查找和切割等操作,对于正则表达式的匹配、替换大家已经不陌生了吧
    2015-12-12
  • Java线程等待唤醒几种方法小结

    Java线程等待唤醒几种方法小结

    线程等待和唤醒有三种实现方法,分别是Object类中的wait、notify,Condition类中的await、signal,LockSupport类中的park、unpark方法,感兴趣的可以了解一下
    2023-10-10
  • Java Hibernate中的查询策略和抓取策略

    Java Hibernate中的查询策略和抓取策略

    Hibernate是一种Java对象关系映射框架,提供了多种查询和抓取策略,用于优化数据库访问性能。查询策略包括延迟加载、立即加载、查询缓存等,抓取策略包括join抓取、子查询抓取、批量抓取等。这些策略可以根据实际应用场景进行选择和配置,提高数据访问的效率和稳定性
    2023-04-04
  • java使用CountDownLatch实现多线程协作

    java使用CountDownLatch实现多线程协作

    在多线程编程中,经常需要实现一种机制来协调多个线程的执行,以确保某些操作在所有线程完成后再进行,CountDownLatch 就是 Java 并发包中提供的一种同步工具,下面我们就来看看如何使用CountDownLatch实现多线程协作吧
    2023-11-11
  • Java定时任务取消的示例代码

    Java定时任务取消的示例代码

    java定时任务如何取消,并比如,我之前想每周二晚上6点自动生成一条devops流水线,现在我想停掉,下面给大家分享java定时任务取消的示例代码,演示如何创建一个每周二晚上6点自动生成一条devops流水线的定时任务,感兴趣的朋友一起看看吧
    2024-02-02
  • java中lambda(函数式编程)一行解决foreach循环问题

    java中lambda(函数式编程)一行解决foreach循环问题

    这篇文章主要介绍了java中lambda(函数式编程)一行解决foreach循环问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • JVM类加载机制原理及用法解析

    JVM类加载机制原理及用法解析

    这篇文章主要介绍了JVM类加载机制原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • java将一个整数转化成二进制代码示例

    java将一个整数转化成二进制代码示例

    这篇文章主要介绍了java将一个整数转化成二进制代码示例,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • SpringBoot Maven的操作与配置图文教程

    SpringBoot Maven的操作与配置图文教程

    Spring Boot开发中,将项目打包为可执行JAR是部署到生产环境的关键步骤,这篇文章主要介绍了SpringBoot Maven操作与配置的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-10-10

最新评论