`
lyunabc
  • 浏览: 551563 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

Java中4种引用的简要解释

 
阅读更多

在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。这 就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走。一般说来,如果物品已经被扔到垃圾箱,想再 把它捡回来使用就不可能了。

但有时候情况并不这么简单,你可能会遇到类似鸡肋一样的物品,食之无味,弃之可惜。这种物品现在已经无用了,保留它会占空间,但是立刻扔掉它也不划算,因 为也许将来还会派用场。对于这样的可有可无的物品,一种折衷的处理办法是:如果家里空间足够,就先把它保留在家里,如果家里空间不够,即使把家里所有的垃 圾清除,还是无法容纳那些必不可少的生活用品,那么再扔掉这些可有可无的物品。

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

1.强引用
普通用的引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。

2.软引用(SoftReference)
如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
3.弱引用(WeakReference)
如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

4.虚引用(PhantomReference)
"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃 圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是 否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

分享到:
评论

相关推荐

    Java 内存简要

    ### Java内存简要 #### 第一讲:Java基本概念 - **JDK**: Java Development Kit,Java开发工具包,包含了Java运行环境(JRE)、Java工具(如编译器`javac`、解释器`java`等)以及Java的基础类库(即Java API,包括...

    Java简明教程.ppt

    - **注意点**:Java是区分大小写的,使用`.`来引用对象的属性和方法,分隔路径,以及标识方法参数的开始和结束。 4. **程序运行**: - 使用`javac`命令编译Java源代码(.java文件)生成字节码(.class文件)。 -...

    JAVA核心知识点整理

    Java提供了四种引用类型:强引用、软引用、弱引用和虚引用。强引用指代的对象只要还存在强引用,就不会被垃圾回收器回收;软引用描述的对象在内存不足时会被回收;弱引用比软引用更弱,其指向的对象只能存活到下一次...

    Java编程规范 The Java Language Specification Java SE 9

    4. **类型、值与变量**:这一章节详细解释了Java中的不同类型(如原始类型、引用类型)、值及变量的用法,并对类型擦除等高级主题进行了讨论。 #### 三、Java SE 9 特性详解 ##### 1. **词法结构** - **Unicode**...

    Java基础教程PPT

    最后,可能会简要介绍Java的泛型、注解和枚举,这些都是现代Java编程中不可或缺的特性。 在学习过程中,PPT通常会包含实例代码和解释,帮助学习者更好地理解和应用这些概念。同时,课后练习和项目实践是巩固理论...

    《Java 8 in Action》是一本关于 Java 编程语言的书籍,重点介绍了 Java 8 中引入的新特性和改进

    该书由 Mario Fusco、Alan Mycroft 和 Raoul-Gabriel Urma 合著,旨在帮助读者深入了解 Java 8,并掌握其中的关键...其他新特性: 简要介绍 Java 8 中引入的其他新特性,如接口的默认方法、方法引用、Optional 类型等。

    Java关键字分类解释

    ### Java关键字分类解释 #### 一、类与接口定义关键字 - **class**: 在Java中,`class`关键字用于声明一个类。类是面向对象编程的基本单元,它定义了一组属性(成员变量)和方法(成员函数),这些共同构成了一个...

    Java语言编程基础及Web开发入门教程:Java 是一种广泛使用的面向对象编程语言,以其平台无关性和安全性著称 Java 不仅

    javascript:Java 是一种广泛使用的面向对象编程语言,以其平台无关性和安全性著称。Java 不仅适用于桌面应用程序开发,还特别适合 Web 开发,包括服务器端开发、Android 应用开发等。下面是一个简要的 Java 编程...

    23种设计模式的java实现

    以下是对23种经典设计模式的简要介绍及其在Java中的实现方式: 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在Java中,可以使用静态内部类、枚举或双检锁(Double-Checked Locking)实现。 2...

    java教程—中文文章(chm)

    4. **接口与包**:理解Java中的接口如何实现多继承,以及如何通过包来组织和管理类。 5. **数组与集合框架**:介绍不同类型的数组和集合,如ArrayList、LinkedList、HashSet、HashMap等,以及它们的操作方法和适用...

    JAVA面试题2019

    9. **Java内存模型**:解释变量的可见性、有序性和原子性。 10. **线程池调优**:如何根据应用的特点合理配置线程池。 11. **ThreadLocal** 的使用注意事项。 12. **CountDownLatch** 与 **CyclicBarrier** 的用法及...

    23种设计模式的java实现.zip

    下面将详细解释这些设计模式及其在Java中的实现。 1. **单例模式 (Singleton)**:确保一个类只有一个实例,并提供全局访问点。在Java中,通常使用双重检查锁定(Double-Checked Locking)或者静态内部类的方式来...

    Java 基础ppt.zip

    Java是一种广泛使用的高级编程语言,尤其在企业级应用开发领域占据主导地位。这份"Java基础ppt.zip"压缩包提供了一套完整的Java基础知识学习资源,专为初学者设计,旨在帮助那些对IT行业感兴趣的新手从零开始系统地...

    Head First Java 中文高清版

    2. **面向对象编程基础**:Java是一种面向对象的语言,书中会深入解释面向对象编程(OOP)的基本概念,如类、对象、封装、继承和多态性。这些概念是理解Java编程的基础。 3. **变量与数据类型**:书中会详细介绍...

    java的基本类型详解

    Java是一种静态类型语言,它提供了8种基本数据类型,用于存储原始数据。以下是对Java基本数据类型的简要概述: 基本数据类型直接存储数据,不存储引用。 每种类型有固定的内存大小和取值范围。 它们具有默认值,未...

    Java中的23种设计模式

    在这里,我们将重点关注Java中的代理模式,同时也会对其他主要设计模式进行简要概述。 **代理模式**是一种结构型设计模式,它为其他对象提供一种代理以控制对该对象的访问。在代理模式中,代理类作为目标对象的替代...

    23种设计模式的Java实现

    以下是23种设计模式的简要介绍,以及它们在Java中的实现方式: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。Java中可以使用双重检查锁定(DCL)、静态内部类或枚举来实现。 2. **工厂方法模式**...

Global site tag (gtag.js) - Google Analytics