强引用就是指在程序代码之中普遍存在的,指创建一个对象并把这个对象赋给一个引用变量,并没有像其它三种引用一样有一个就具体的类来描述。对于强引用对象,即使内存不足,JVM宁愿抛出OutOfMemoryError (OOM)错误也不会回收这种对象。

例如:

Object object =new Object(); String str ="hello";

如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。比如各种集合的移除方法。

2软引用

SoftReference< People > aSoftRef=new SoftReference< People >(obj)

软引用是用来描述一些还有用但并非必需的对象。只使用SoftReference类修饰的对象就是一个软引用对象(软可到达对象),如果一个对象只具有软引用,内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。

常常用于缓存操作,把某个对象标记为软引用时,当内存足够就不会回收,内存不足就会回收,比如网页缓存,图片缓存等。并且软引用都会保证在虚拟机抛出OutOfMemoryError之前已经被清除。

3弱引用

WeakReference< People > reference=new WeakReference< People >(obj);

弱引用也是用来描述非必需对象的。只使用WeakReference类修饰的对象就是一个弱引用对象(弱可达对象)。弱引用的对象相比软引用拥有更短暂的生命周期。无论内存是否足够,一旦下次垃圾回收器运行后扫描到弱引用,便会回收。 不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

Java中有WeakHashMap类,以及THreadLocal中的ThreadLocalMap内部节点Entry,他们都是WeakReference的实现。

4虚引用

PhantomReference< People > pr = new PhantomReference< People > (object, ReferenceQueue);

虚引用也称为幽灵引用或者幻影引用,它是最弱的一种引用关系,虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。

无法通过get获取该引用,但其实虚引用其实是持有对象引用的,只是PhantomReference的get方法的实现永远返回null。

先要纠正一种观点,一个对象被关联成虚引用,是完全有可能影响其生命周期的,虚引用有潜在的内存泄露风险,因为JVM不会自动帮助我们释放,我们必须要保证它指向的堆对象是不可达的。

一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时会被加入到相关引用队列中,常常被用于管理堆外内存的清理,DirectByteBuffer等能够申请堆外内存的对象均与一个虚引用相关联,当DirectByteBuffer对象被回收时,会被加入到一个引用队列,此时GC会判断队列中的对象,并且对DirectByteBuffer对象申请的堆外内存进行清理。

喜欢的话点赞转发支持一下哦

end

java弱引用弱点_终于有人把Java强、软、弱、虚四种引用知识点整理出来了相关推荐

  1. 多线程与高并发(五):强软弱虚四种引用以及ThreadLocal的原理与源码

    上节回顾 AQS(CLH的变种) 因为新加进来的节点要查看前面的节点的状态,所以使用的是双向链表. AQS的底层是 CAS + Volitile,用CAS替代了锁整个链表的操作. 公平锁:上来先排队 ...

  2. 通过强弱软虚四种引用进一步了解垃圾回收机制

    在Java对象里,有强弱软虚四种引用,它们都和垃圾回收流程密切相关,在项目里,我们可以通过合理地使用不同类型的引用来优化代码的内存使用性能. 指向通过new得到的内存空间的引用叫强引用.比如有Stri ...

  3. java判断多个线程是否跑批完成_终于有人把Java内存模型说清楚了

    内部原理 JVM 中试图定义一种 JMM 来屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果. JMM 的主要目标是定义程序中各个变量的访问规则,即 ...

  4. 来电通java版_终于有人把Java程序员必学知识点整理出来了,令人有如醍醐灌顶...

    JVM 无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎.不管是工作还是面试中,JVM都是必考题.如果不懂JVM的话,薪酬会非常吃亏(近70%的面试者挂在JVM上了) 详细介绍了JVM有关于 ...

  5. 【Java】强软弱虚四种引用,弱引用在ThreadLocal中的应用

    Java中的引用类型 - 强软虚弱 1.强引用(StrongReference) Object strongReference = new Object(); 只要有引用指向它,就不会被回收.当内存空 ...

  6. java高性能反射框架_终于有人把性能优化讲清楚了!阿里架构师推荐的Java性能权威指南可太强了...

    Java给大部分人的感觉就是慢,有严重的性能问题.其实程序慢的问题,与语言无关,与Java无关.Java应用的性能优化也是一个老生常谈的话题,但是只要我们深入的了解性能调优方法,走遍天下都不怕! 大多 ...

  7. JVM day03 四种引用 垃圾回收

    JVM day03 如何判断对象可以回收 引用计数法 一旦相互持有引用,就导致对象永远没法被回收. jvm并没有采用这种算法. 可达性分析算法 由GC Root出发,开始寻找,看看某个对象是否可达,如 ...

  8. java 四种内存_不可访问内存 Java四种引用包括强引用,软引用,弱引用,虚引用...

    小结: 1.不可访问内存是指一组没有任何可访问指针指向的由计算机程序进行动态分配的内存块. 2.垃圾收集器能决定是否一个对象还是可访问的:任何被确定不可访问的对象将会被释放. https://zh.w ...

  9. 终于有人把Java技术知识面试体系整理出来了,这些文档让你的面试稳如泰山

    程序猿,一个懂JAVA语言.C++语言.C语言.PHP语言等非人类语言的人类,在普通人看来,做好程序猿太难了.在IT行业有这样一句话:面试造火箭,工作拧螺丝,就是针对程序员的.可想而知,能进入程序猿行 ...

最新文章

  1. 网站的安全证书存在安全问题,无继续浏览按钮
  2. 很有必要看,这篇 解决 IndexError: list index out of range
  3. 基于FPGA的波速形成实现
  4. DSP、ARM和单片机的区别
  5. 什么情况下会导致@Async异步方法会失效?
  6. SecureCRT 文件下载上传
  7. IDEA查看Scala的源码
  8. C#如何获得屏幕宽度和高度
  9. bae3.0第三步 添加默认管理后台模块和mysql库
  10. 云队友丨巴菲特是怎样炼成的?两万字长文深度起底股神的传奇人生
  11. 全面解析免费及收费SSH工具的基本特性和总结
  12. 计算机桌面广告弹窗,电脑乱弹广告怎么办_怎么禁止桌面弹出广告
  13. 国内外PaaS案例解析、赛道、趋势
  14. 49天精通Java,第12天,Java接口的作用和意义
  15. linux完全卸载ffmpeg_RoboMaster视觉教程Linux(四)软件安装和卸载
  16. 基于STM32单片机的直流电机控制系统加减速正反转设计方案原理图程序
  17. 科学计算库学习笔记(持续更新)
  18. svn blame功能
  19. IE主页改不了怎么办
  20. QQMail邮件泄露漏洞

热门文章

  1. 手机数据抓包入门教程
  2. php 获得用户地址吗,php获得用户的真实IP地址_PHP教程
  3. java io nio socket_通过socket编程掌握IO流 —— NIO
  4. electron 安装import_Electron: 从零开始写一个记事本app
  5. 芝麻翻译软件测试,细数35个单元测试准则 “Hello, world!”
  6. oracle 10g搭建dg,oracle 10g dg环境的搭建
  7. python post请求 上传图片_利用python模拟实现POST请求提交图片的方法
  8. UIView加任意边框(Masonry)
  9. java向上造型的优点_老榆木家具适合什么装修风格?老榆木家具有哪些优点
  10. 谷歌启动AlphaFold商业化:成立新公司,专注AI新药开发技术