`

浅谈Java对象的强、软、弱和虚引用(转载)

 
阅读更多

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

        但有时候情况并不这么简单,你可能会遇到类似鸡肋一样的物品,食之无味,弃之可惜。这种物品现在已经无用了,保留它会占空间,但是立刻扔掉它也不划算,因 为也许将来还会派用场。对于这样的可有可无的物品,一种折衷的处理办法是:如果家里空间足够,就先把它保留在家里,如果家里空间不够,即使把家里所有的垃 圾清除,还是无法容纳那些必不可少的生活用品,那么再扔掉这些可有可无的物品。从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活 的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

 

 

1.强引用

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

 

2.软引用(SoftReference)

 

  如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象 的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。软引用可以和一个引用队列 (ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

 

 

3.弱引用(WeakReference)

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

 

 

4.虚引用(PhantomReference)

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

 

 

分享到:
评论

相关推荐

    浅谈java面向对象和引用

    ### 浅谈Java面向对象与引用 在Java学习过程中,对于面向对象的理解和引用机制的掌握是至关重要的。本文将围绕这两个概念进行深入探讨,并针对初学者常见的疑惑点进行解答。 #### Java面向对象基础 Java是一种...

    总结一——浅谈Java的类与对象

    在Java编程语言中,类与对象是核心概念,它们构成了面向对象编程的基础。这篇博文将深入探讨这两个概念,以及它们如何...通过阅读“浅谈Java的类与对象”这篇文档,你将能更深入地了解这些核心概念,提升你的编程技能。

    浅谈Java优势

    浅谈Java优势,关于java优势......

    浅谈Java中Mysql数据库的连接与操作.pdf

    在现代软件开发中,Java语言和MySQL数据库的结合使用是技术领域中一个非常普遍且重要的课题。Java作为一门广泛应用于商业、企业级应用开发的编程语言,其稳定性和跨平台能力使其在软件开发领域占据着举足轻重的地位...

    浅谈Java软件测试.pdf

    3. Java语言在软件行业中的应用:Java语言由于其简单、面向对象、安全、健壮、可移植、多线程等特点,在中国的软件行业和金融行业中得到了广泛应用。文中也提到了一些基于Java技术的自动化测试工具,例如JUnit、...

    浅谈Java面向对象程序设计.pdf

    "浅谈Java面向对象程序设计" Java是一种面向对象的高级编程语言,其核心思想是模拟现实生活中的求解过程。面向对象程序设计是人类思维自然化的结果,是从低级到高级的发展结果。在Java语言中,面向对象内容主要包括...

    浅谈Java引用和Threadlocal的那些事

    Java中有四种引用类型:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。 1. 强引用(Strong Reference): 强引用是Java中最常见的引用类型,...

    浅谈Java中的对象和对象引用

    在Java中,有一组名词经常一起出现,它们是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然。我们来一起了解一下对象和对象引用之间的区别和联系。  1....

    浅谈JAVA垃圾回收机制.pdf

    浅谈 JAVA 垃圾回收机制 Java 垃圾回收机制是 Java 语言中的一种自动内存管理机制,它可以自动回收内存中的垃圾,避免代码运行时由于忘记释放对象而带来的内存泄漏问题。 Java 中的垃圾回收机制主要通过两种算法来...

    浅谈Java 中的引用类型

    Java 中的引用类型是 Java 开发者非常熟悉的一个概念,它们从强到弱分别是:强引用、软引用、弱引用和虚引用。下面我们详细看看这些引用类型。 强引用 强引用是 Java 中最常见的一种引用类型。例如,Object object...

    浅谈Java中的四种引用方式的区别

    本文将深入探讨这四种引用——强引用、软引用、弱引用和虚引用,以及它们在内存管理和垃圾回收中的作用。 1. **强引用(StrongReference)** - 强引用是最常见的引用类型,它代表了最常见的对象引用。只要一个对象...

    浅谈JAVA虚拟机JVM及工作原理

    Java 栈的区域很小,只有 1M,特点是存取速度很快,所以在 stack 中存放的都是快速执行的任务,基本数据类型的数据,和对象的引用(reference)。 2. 堆(Heap) 堆是计算机科学中的一种特殊数据结构,通常是一个...

    浅谈JAVA语言.pdf

    "浅谈JAVA语言.pdf" 本文将从Java语言的起源开始,分析Java语言与传统语言的差异,并阐述Java语言为什么能够成为世界上最流行的编程语言的原因。同时,本文还将结合Java语言的特点与技术的发展,探讨Java语言在编译...

    java jvm调优浅谈

    Java JVM 调优浅谈 Java 虚拟机(JVM)是 Java 语言的核心组件之一,...因为 Java 中没有指针的概念,程序运行永远都是在栈中进行的,因而参数传递时,只存在传递基本类型和对象引用的问题。不会直接传递对象本身。

    深入浅出Java 2面向对象程序设计(PDG)

    《深入浅出Java 2面向对象程序设计》是一本针对Java编程初学者和进阶者的重要教程,旨在帮助读者深入理解和掌握面向对象编程的核心概念和技术。面向对象编程(Object-Oriented Programming,简称OOP)是Java语言的...

    浅谈java中的四个核心概念

    ### 浅谈Java中的四个核心概念 随着信息技术的飞速发展与互联网的普及,Java作为一门面向对象的、跨平台的编程语言,在软件开发领域占据了举足轻重的地位。Java不仅仅是一门语言,它更是一个庞大的技术平台。为了更...

    浅谈JAVA技术.pdf

    浅谈JAVA技术.pdf

    浅谈Java的发展及前景.pdf

    "浅谈Java的发展及前景" 经过对文件的分析,我们可以从多个角度来谈论Java的发展及前景。 首先,从Java的发展历史来看,Java是由Sun Microsystems公司于1995年5月推出的面向对象的程序设计语言。Java的出现标志着...

    浅谈Java中的equals和==Java开发Java经验

    在Java编程语言中,`equals()`方法和`==`运算符是两个经常被用来比较对象是否相等的关键概念。理解它们的区别和用法对于任何Java开发者来说都至关重要,特别是对于那些正在积累Java开发经验的人来说。 首先,让我们...

    浅谈Java的接口的作用和意义.pdf

    浅谈 Java 的接口的作用和意义 Java 的接口是一系列方法和特征的集合,它可以对应 Java 中特定的语法结构。接口和抽象类不同,抽象类可以实现某些方法,而接口则不能。接口的概念较为抽象,可以理解为是一系列方法...

Global site tag (gtag.js) - Google Analytics