jvm系列 (四) ---强、软、弱、虚引用

本文深入探讨Java中的四种引用类型——强引用、软引用、弱引用和虚引用的区别及应用场景,包括如何利用这些引用类型进行内存管理和优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java引用

目录

  • jvm系列(一):jvm内存区域与溢出
  • jvm系列(二):垃圾收集器与内存分配策略
  • jvm系列(三):锁的优化
  • 我的博客目录

为什么将引用分为不同的强度

  • 因为我们需要实现这样一种情况,当内存足够的时候,继续保留,内存空间不够的后则可以回收。

强引用

  • 只要强引用还在,被引用的对象不会被回收
People jiajun=new People();

软引用

  • 系统将要发生内存溢出异常之前,会回收软引用的对象,如果回收后还没有足够的内存,抛出内存溢出异常
  • 使用SoftReference类,将要软引用的对象最为参数传入,
  • 传入ReferenceQuue队列的时候,如果引用的对象被回收,这个引用加入到关联的引用队列
SoftReference(T referent) 
          创建引用给定对象的新的软引用。
SoftReference(T referent, ReferenceQueue<? super T> q) 
          创建一个引用给定对象的新的软引用,并向给定队列注册该引用

弱引用

  • 弱引用的对象只能存活在下一次垃圾回收之前,回收时,不管内存是否足够,都会将弱引用的对象回收
  • 使用WeakReference类,将要弱引用的对象作为参数传入
  • 传入ReferenceQuue队列的时候,如果引用的对象被回收,这个引用加入到关联的引用队列中
WeakReference(T referent) 
          创建引用给定对象的新的弱引用。
WeakReference(T referent, ReferenceQueue<? super T> q) 
          创建引用给定对象的新的弱引用,并向给定队列注册该引用。

虚引用

  • 虚引用和没有任何引用一样,任何时候都可能被回收
  • 为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。用于跟踪对象的回收状态
  • 使用PhantoReference类,将要虚引用的对象作为参数传入,此时还需要一个ReferenceQueue 对象
  • 对象被回收后,把这个虚引用加入到与之 关联的引用队列中。
PhantomReference(T referent, ReferenceQueue<? super T> q) 
          创建一个引用给定对象的新的虚引用,并向给定队列注册它。

ReferenceQueue的作用

  • public Reference poll():从队列中取出一个元素,队列为空则返回null
  • public Reference remove():从队列中出对一个元素,若没有则阻塞至有可出队元素
  • Reference对象所引用的对象被GC回收时,该Reference对象将会被加入引用队列中
ReferenceQueue queue = new ReferenceQueue(); 
SoftReference ref=new SoftReference(object, queue);
object =null;
  • 当object对象被回收的时候,此时通过ref.get()方法get出来的是null,说明这个对象已经被回收,但是,此时这个ref对象还是存在的,但是现在已经没作用了。引用队列poll出来的是引用对象。所以可以有下面的操作来回收ref对象
SoftReference ref = null; 

while ((ref = (EmployeeRef) q.poll()) != null) { 
   // 清除ref 
} 

使用场景

分析

       Student s1=new Student();
       HashMap<Student, String> map=new HashMap();
       map.put(s1,"jiajun");
       s1=null;
  • 在这种情况下,我们想要是student对象被回收,虽然s1=null,但是hashmap中还有对student对象的引用,所以并不能被回收
  • 因此jdk为我们提供了一个WeakHashMap,通过弱引用来管理entry
 private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> 

实验

public class Test {
    public static void main(String[] args) {
        String s1=new String("1");
        String s2=new String("2");
        String s3=new String("3");
        Map map=new WeakHashMap();
        map.put(s1, "one");
        map.put(s2, "two");
        map.put(s3, "three");
        s1=null;
        System.gc();
        Iterator iter = map.entrySet().iterator();
                while (iter.hasNext()) {
                     Map.Entry en = (Map.Entry)iter.next();
                     System.out.printf("next : %s - %s\n",en.getKey(),en.getValue());
                 }
    }
}
  • 输出:next : 2 - two next : 3 - three
  • 将WeakHashMap修改为HashMap,可以发现输出结果是有三个,在这里可以发现弱引用的作用了

总结

比较强引用软引用弱引用虚引用
使用People p=new People()SoftReference s=new SoftReference(p)WeakReference w=new WeakReference(p)PhantomReference r=new PhantomReference (p,referenceQueue)
回收情况有强引用的时候不会被回收当要内存溢出内存异常的时候,回收软引用的对象下一次回收一定将他回收
适用情况有用但非必须对象非必须对象

我觉得分享是一种精神,分享是我的乐趣所在,不是说我觉得我讲得一定是对的,我讲得可能很多是不对的,但是我希望我讲的东西是我人生的体验和思考,是给很多人反思,也许给你一秒钟、半秒钟,哪怕说一句话有点道理,引发自己内心的感触,这就是我最大的价值。(这是我喜欢的一句话,也是我写博客的初衷)

作者:jiajun 出处: http://www.cnblogs.com/-new/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。

内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增和毫米波通信,为读者提供了更广阔的视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值