`

Java引用(来源:万恶互抄互联网)

    博客分类:
  • java
 
阅读更多

声明这篇文章网上很多,我是从一同事云笔记分享过来的,就不标记原始出处了,我也不知道原始出处。

——————————————————————————————————————————————

很早Java API就添加了弱引用(WeakReference)和软引用(SoftReference),但并不是所有的程序员都熟悉这两个概念

知道弱引用和软引用的概念与如何使用它们是两码事,引用类在垃圾回收工作的过程中有重要作用。我们都知道垃圾回收器会回收符合回收条件的对象的内 存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型。这正是Java中弱引用和软引用的主要区别。如果一个对象只有弱引用指向它,垃圾回 收器会立即回收该对象,这是一种急切回收方式。相对的,如果有软引用指向这些对象,则只有在JVM需要内存时才回收这些对象。弱引用和软引用的特殊行为使 得它们在某些情况下非常有用。例如:软引用可以很好的用来实现缓存,当JVM需要内存时,垃圾回收器就会回收这些只有被软引用指向的对象。而弱引用非常适 合存储元数据,例如:存储ClassLoader引用。如果没有类被加载,那么也没有指向ClassLoader的引用。一旦上一次的强引用被去除,只有 弱引用的ClassLoader就会被回收。这篇文章中我们将讲述不同类型的Java引用,例如:强引用(Strong Reference)和虚引用(PhantomReference)。

Java中弱引用VS软引用

Java中有如下四种类型的引用:

1.强引用(Strong Reference)

2.弱引用(WeakReference)

3.软引用(SoftReference)

4.虚引用(PhantomReference)

强引用是我们在编程过程中使用的最简单的引用,如代码String s=”abc”中变量s就是字符串对象”abc”的一个强引用。任何被强引用指向的对象都不能被垃圾回收器回收,这些对象都是在程序中需要的。弱引用使用 java.lang.ref.WeakReference class 类来表示,你可以使用如下代码创建弱引用:

复制代码 代码如下:

 

Counter counter = new Counter(); // strong reference - line 1

WeakReference<Counter> weakCounter = new WeakReference<Counter>(counter); //weak reference

counter = null; // now Counter object is eligible for garbage collection

现在只要你给强引用对象counter赋空值null,该对象就可以被垃圾回收器回收。因为该对象此时不再含有其他强引用,即使指向该对象的弱引用 weakCounter也无法阻止垃圾回收器对该对象的回收。相反的,如果该对象含有软引用,Counter对象不会立即被回收,除非JVM需要内存。 Java中的软引用使用java.lang.ref.SoftReference类来表示,你可以使用如下代码创建软引用:

复制代码 代码如下:

 

Counter prime = new Counter(); // prime holds a strong reference – line 2

SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object created at line 2

 

prime = null; // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory

强引用置空之后,代码的第二行为对象Counter创建了一个软引用,该引用同样不能阻止垃圾回收器回收对象,但是可以延迟回收,与弱引用中急切回 收对象不同。鉴于软引用和弱引用的这一区别,软引用更适用于缓存机制,而弱引用更适用于存贮元数据。另一个使用弱引用的例子是WeakHashMap,它 是除HashMap和TreeMap之外,Map接口的另一种实现。WeakHashMap有一个特点:map中的键值(keys)都被封装成弱引用,也 就是说一旦强引用被删除,WeakHashMap内部的弱引用就无法阻止该对象被垃圾回收器回收。

虚引用是java.lang.ref package包中第三种可用的引用,使用java.lang.ref.PhantomReference类来表示。拥有虚引用的对象可以在任何时候被垃圾回收器回收。和弱引用和软引用相似,你可以通过如下代码创建虚引用:

复制代码 代码如下:

 

DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference – line 3

PhantomReference phantom = new PhantomReference(digit); // phantom reference to object created at line 3

 

digit = null;

一旦移除强引用,第三行的DigitalCounter对象可以在任何时候被垃圾回收器回收。因为只有一个虚引用指向该对象,而虚引用无法阻止垃圾回收器回收对象。

除了了解弱引用、软引用、虚引用和WeakHashMap,还需要了解ReferenceQueue。在创建任何弱引用、软引用和虚引用的过程中你可以通过如下代码提供引用队列ReferenceQueue:

复制代码 代码如下:

 

ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup

DigitalCounter digit = new DigitalCounter();

PhantomReference<DigitalCounter> phantom = new PhantomReference<DigitalCounter>(digit, refQueue);

引用实例被添加在引用队列中,你可以再任何时候通过查询引用队列回收对象。一个对象的生命周期可以通过下图进行描述:

JAVA引用

这就是Java中弱引用和软引用的区别。我们还学到了一些基本的引用类:弱引用、软引用、虚引用以及WeakHashMap和WeakHashMap。总之,合理的使用引用可以帮助垃圾回收器更好的管理Java内存。

 

分享到:
评论

相关推荐

    高级java笔试题-learning-java-bible:Java宝典--实战及解析

    高级java笔试题 Java 宝典 一切都是逻辑。 十大名言: Talk is cheap, show me code.(知易行难) -- Linus Torvalds(Linux创始人) 源码面前了无秘密。-- 侯捷 《STL源码剖析》作者 不要重复发明轮子。-- Rod Johnson...

    万恶之源:伟大的迅雷!

    万恶之源:伟大的迅雷!

    万恶之源2011VIP内部135

    【万恶之源2011VIP内部135】是一个特定版本的网络安全工具,由“万恶之源网安基地”站长开发。这个工具的名称中提到的“135抓鸡”,实际上指的是在网络安全领域中寻找并控制易受攻击的服务器或计算机的行为,这些...

    万恶的Blogbus教程免费版.rar

    这篇"万恶的Blogbus教程免费版"很可能是针对初学者或者那些希望深入理解Blogbus平台特性的用户设计的。从提供的文件列表来看,我们有以下三个文件: 1. **下载说明.txt** - 这个文件可能包含了下载教程的具体步骤,...

    Java-JUC-多线程 进阶

    原子引用是 Java 中的一种机制,用于描述原子的变量访问。原子引用可以用于解决多种并发编程问题,例如原子变量、锁机制等。 Java 锁 Java 锁是 Java 中的一种机制,用于保护共享资源免受多个线程的并发访问。Java...

    Java Performance

    《Java性能》是由Charlie Hunt和Binu John共同编著的一本深入探讨Java应用程序性能优化的专业书籍。这本书旨在帮助Java开发者和系统管理员理解如何在实际环境中有效地提升Java应用的性能。 一、Java虚拟机(JVM)的...

    万恶的反对风格如果我

    很抱歉,但根据您提供的信息,标题"万恶的反对风格如果我"和描述"斯蒂芬告诉对方告诉对方告诉对方告诉对方的方式告诉对方公司法"似乎与IT知识不直接相关,同时也无法明确地指向任何特定的技术主题。标签"法大赛官方...

    非常实用的java代码优化详解

    Java代码优化是提升程序性能和效率的关键步骤,它涉及到多个层面,包括对象声明、循环、初始化、堆栈管理和异常处理等方面。以下是对这些知识点的详细解释: 1. **对象声明**: - 避免无用的对象创建:频繁创建和...

    Java开发规范.doc

    《Java开发规范》是北京韩金网络技术有限公司在2015年制定的一份详细的编程指导文档,旨在为Java项目的开发提供一套统一、严谨的标准,提高代码质量和团队协作效率。以下将对文档中的主要知识点进行详细说明: 1. *...

    万恶的前端内存泄漏及万善的解决方案详解.docx

    前端内存泄漏及解决方案详解 在前端开发中,内存泄漏是一个非常重要的主题。...通过避免创建全局变量、解除闭包、手动删除 dom 的引用和定时器,开发者可以避免内存泄漏的发生,提高系统性能和用户体验。

    万恶的斐波那契.exe

    万恶的斐波那契.exe

    万恶的Appuse-----Appuse2.X在MyEclipse之中的部署问题

    【标题】:“万恶的Appuse-----Appuse2.X在MyEclipse之中的部署问题” 在探讨Appfuse 2.x在MyEclipse中的部署问题前,我们先来了解下Appfuse和MyEclipse这两个关键概念。 Appfuse是一个开源项目,它提供了一种快速...

    android去万恶的广告补丁

    在Android系统中,广告是许多免费应用的主要收入来源,但它们有时可能会打扰用户的使用体验。"android去万恶的广告补丁"是一个针对这一问题的解决方案,旨在帮助用户去除应用程序中的广告,提升使用舒适度。这个补丁...

    《万恶迷糊尤物》第三技:笑看混战人1000字.docx

    《万恶迷糊尤物》第三技:笑看混战人1000字 本篇小说主要讲述了格湘和殷澈之间的故事,并揭示了格湘的真实身份。故事开头,格湘和殷澈之间发生了一些有趣的互动,殷澈表现出对格湘的保护和照顾。然而,安洁却指控格...

    贪吃蛇java程序源码-CalabashBrother:一个用Java编写的体育游戏

    贪吃蛇java程序源码 葫芦兄弟大闹超级碗 游戏介绍 背景 万恶的蛇精把老爷爷绑架了,并命令蝎子精带领部下把守大门。老爷爷吃下了有毒的饭菜,急需解药!葫芦兄弟必须越过一片橄榄球场,及时将老爷爷救出并让他服下...

    leetcode18java-COMP603-2015:COMP603-2015

    java 编译器设计 7 月 13 日:状态更新 所有人的状态更新。 请使用以下内容填充您的自述文件: 你在做什么? 你的实现语言是什么? 到目前为止你做了什么? 您是否达到了本周的期望? 你希望下周完成什么? 如何? ...

    java餐饮小程序源码-performance-checklist::chart_increasing:性能优化技术的综合列表,可提高您网站的性能

    java餐饮小程序源码 :chart_increasing: 性能检查表是性能优化技术的综合列表,用于提高您网站的性能,并由此改善其用户体验。 :UP!_button: “过早的优化是万恶之源”——Donald Knuth • • • :card_file_box: ...

    DuplicateLines:揪出万恶的重复代码

    最好在写的时候就消灭重复代码,但总有接手别人的项目的时候 考虑到重复代码经常是 复制 粘贴 导致,所以暂且以 一行 为最小单位,展示出现的次数 根据 Obj-C 的关键字,去除一些重复行 删除 注释行 和 空格 ...

Global site tag (gtag.js) - Google Analytics