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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何使用@Value和@PropertySource注入外部资源

    如何使用@Value和@PropertySource注入外部资源

    这篇文章主要介绍了如何使用@Value和@PropertySource注入外部资源的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java编程用指定字符打印菱形实例

    Java编程用指定字符打印菱形实例

    本文主要介绍了用指定的字符打印菱形的方法实例,一个简单容日上手的小程序,喜欢的朋友可以拿来练习一下。
    2017-09-09
  • 基于Spring实现文件上传功能

    基于Spring实现文件上传功能

    这篇文章主要为大家详细介绍了Spring实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Java中关于Map四种取值方式

    Java中关于Map四种取值方式

    这篇文章主要介绍了Java中关于Map四种取值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • java 中Collection存储器详解及简单实例

    java 中Collection存储器详解及简单实例

    这篇文章主要介绍了java 中Collection存储器详解及简单实例的相关资料,需要的朋友可以参考下
    2017-04-04
  • mybatis的insert语句插入数据时的返回值的实现

    mybatis的insert语句插入数据时的返回值的实现

    这篇文章主要介绍了mybatis的insert语句插入数据时的返回值的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 基于request获取访问者真实IP代码示例

    基于request获取访问者真实IP代码示例

    这篇文章主要介绍了基于request获取访问者真实IP代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java引用传递实现方式以及与值传递的区别

    Java引用传递实现方式以及与值传递的区别

    这篇文章主要给大家介绍了关于Java引用传递实现方式以及与值传递的区别的相关资料,引用传递指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数,需要的朋友可以参考下
    2023-09-09
  • java servlet手机app访问接口(一)数据加密传输验证

    java servlet手机app访问接口(一)数据加密传输验证

    这篇文章主要为大家详细介绍了java servlet手机app访问接口(一),数据加密传输验证,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 详解SpringBoot配置devtools实现热部署

    详解SpringBoot配置devtools实现热部署

    本篇文章主要介绍了详解SpringBoot配置devtools实现热部署 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05

最新评论