千家信息网

Java中的引用知识点总结

发表于:2024-10-19 作者:千家信息网编辑
千家信息网最后更新 2024年10月19日,本篇内容介绍了"Java中的引用知识点总结"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!强引用:默认
千家信息网最后更新 2024年10月19日Java中的引用知识点总结

本篇内容介绍了"Java中的引用知识点总结"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

  • 强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)

  • 软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)

  • 弱引用:在GC时一定会被GC回收

  • 虚引用:由于虚引用只是用来得知对象是否被GC

一. 强引用(StrongReference)

强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下:

Object strongReference = new Object();

当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 如果强引用对象不使用时,需要弱化从而使GC能够回收,如下:

strongReference = null;

显式地设置strongReference对象为null,或让其超出对象的生命周期范围,则gc认为该对象不存在引用,这时就可以回收这个对象。具体什么时候收集这要取决于GC算法。

二. 软引用(SoftReference)

如果一个对象只具有软引用,则内存空间充足时,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。

软引用可用来实现内存敏感的高速缓存。

// 软引用    String str = new String("abc");    SoftReference softReference = new SoftReference(str);

当内存不足时,JVM首先将软引用中的对象引用置为null,然后通知垃圾回收器进行回收:

if(JVM内存不足) {        // 将软引用中的对象引用置为null        str = null;        // 通知垃圾回收器进行回收        System.gc();    }

也就是说,垃圾收集线程会在虚拟机抛出OutOfMemoryError之前回收软引用对象,而且虚拟机会尽可能优先回收长时间闲置不用的软引用对象。对那些刚构建的或刚使用过的"较新的"软对象会被虚拟机尽可能保留,这就是引入引用队列ReferenceQueue的原因。

应用场景

浏览器的后退按钮。按后退时,这个后退时显示的网页内容是重新进行请求还是从缓存中取出呢?这就要看具体的实现策略了。

  1. 如果一个网页在浏览结束时就进行内容的回收,则按后退查看前面浏览过的页面时,需要重新构建;

  2. 如果将浏览过的网页存储到内存中会造成内存的大量浪费,甚至会造成内存溢出。

这时候就可以使用软引用,很好的解决了实际的问题:

// 获取浏览器对象进行浏览    Browser browser = new Browser();    // 从后台程序加载浏览页面    BrowserPage page = browser.getPage();    // 将浏览完毕的页面置为软引用    SoftReference softReference = new SoftReference(page);    // 回退或者再次浏览此页面时    if(softReference.get() != null) {        // 内存充足,还没有被回收器回收,直接获取缓存        page = softReference.get();    } else {        // 内存不足,软引用的对象已经回收        page = browser.getPage();        // 重新构建软引用        softReference = new SoftReference(page);    }

三. 弱引用(WeakReference)

弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

 String str = new String("abc");    WeakReference weakReference = new WeakReference<>(str);    str = null;

如果一个对象是偶尔(很少)的使用,并且希望在使用时随时就能获取到,但又不想影响此对象的垃圾收集,那么你应该用Weak Reference来记住此对象。一个使用弱引用的例子是WeakHashMap,它是除HashMap和TreeMap之外,Map接口的另一种实现。WeakHashMap有一个特点:map中的键值(keys)都被封装成弱引用,也就是说一旦强引用被删除,WeakHashMap内部的弱引用就无法阻止该对象被垃圾回收器回收。

下面的代码会让一个弱引用再次变为一个强引用:

    String str = new String("abc");    WeakReference weakReference = new WeakReference<>(str);    // 弱引用转强引用    String strongReference = weakReference.get();

Threadlocal中的ThreadLocalMap的成员变量,ThreadLocalMap 内部采用WeakReference数组保存,数组的key即为ThreadLocal 内部的Hash值。

四. 虚引用(PhantomReference)

虚引用顾名思义,就是形同虚设。与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

应用场景

虚引用主要用来跟踪对象被垃圾回收器回收的活动。 虚引用与软引用和弱引用的一个区别在于:

虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

    String str = new String("abc");    ReferenceQueue queue = new ReferenceQueue();    // 创建虚引用,要求必须与一个引用队列关联    PhantomReference pr = new PhantomReference(str, queue);

程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要进行垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

"Java中的引用知识点总结"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

对象 内存 垃圾 回收器 浏览 队列 程序 知识 内容 空间 缓存 页面 周期 场景 情况 生命 线程 网页 应用 知识点 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州华为鲲鹏服务器价格是多少 互联网科技金融概念股 不常见的网络安全和管理设备 蚌埠市公安局网络安全保卫支队 网络安全技术选择题答案 数据库设计不遵循范式 文秘和计算机网络技术哪个好 戴尔dns服务器异常 pptp验证数据库 美国云服务器提供商 关系数据库的关系结构 江苏人工智能软件开发价钱是多少 只读的服务器怎么分配权限 网络安全小报三年级上 从服务器打开网站显示iis 东丽区品牌软件开发价格走势 触摸屏考勤机软件开发 快速查询数据库的记录数 服务器可以做硬盘吗 视频服务器内存大小 安徽德杰丰互联网科技 软件系统和软件开发 兰州赛图网络技术有限公司 数据库的findall 内窥镜软件开发更新内容描述 软件开发工程师容易被淘汰吗 上传图片保存到数据库 校园广播剧软件开发 平果手机连接不了服务器 服务器需要外接显示器吗
0