各种引用的区别

本文探讨了Java中的不同引用类型(强引用、软引用、弱引用和虚引用)及其在内存回收中的作用,重点讲解了如何避免内存泄漏,特别提到了字符串缓存和内存泄漏的实例。通过实例解析内存泄漏的概念,并揭示弱引用在预防内存泄漏中的关键作用。
摘要由CSDN通过智能技术生成
        //强引用,垃圾收集器不会碰这种对象。
        byte[] bytes = new byte[1024 * 1024 * 8];
        
        //软引用,一般不会被回收,只有当内存不足时,才会被回收。(会引起OOM异常)一般可以当作缓存来使用,Glide 图片加载框架的内存缓存就使用到了弱引用缓存机制
        //OOM - OutOfMemory
        SoftReference<String> softReference = new SoftReference<>(new String("jeff.chan"));

        //弱引用,只能存活到下一次垃圾回收之前,如果进行垃圾回收,那么一定会被回收
        //ThreadLocal里面使用到了弱引用对象,可以减少内存泄漏的发生
       WeakReference<String> weakReference = new WeakReference(new String("jeff.chan"));

       //虚引用,必须要搭配队列使用.仅仅提供了一种确保对象被finalize以后,做某些事情的机制。
        ReferenceQueue<String> queue = new ReferenceQueue<>();
        PhantomReference<String> phantomReference = new PhantomReference<>(new String("jeff.chan"), queue);
        phantomReference.get();

而目前比较流行的回收算法是可达性分析算法。

什么是内存泄漏

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能使系统崩溃。

对对象进行弱引用不会影响垃圾回收器回收该对象,即如果一个对象只有弱引用存在了,则下次GC将会回收掉该对象(不管当前内存空间足够与否)。

再来说说内存泄漏,假如一个短生命周期的对象被一个长生命周期对象长期持有引用,将会导致该短生命周期对象使用完之后得不到释放,从而导致内存泄漏。

因此,弱引用的作用就体现出来了,可以使用弱引用来引用短生命周期对象,这样不会对垃圾回收器回收它造成影响,从而防止内存泄漏。

字符串缓存

在我们创建字符串对象并调用intern()方法的时候,如果已经有缓存的字符串,就会返回缓存里的实例。
今日String/StringBuffer/StringBuilder心得:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值