`
silentJesse
  • 浏览: 107520 次
  • 性别: Icon_minigender_1
  • 来自: 福建厦门
社区版块
存档分类
最新评论

对强引用,弱引用,软引用的定义

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

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


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


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

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

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

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







分享到:
评论

相关推荐

    Java 7之基础 - 强引用、弱引用、软引用、虚引用1

    然而,为了更好地控制内存,Java提供了不同类型的引用:强引用、弱引用、软引用和虚引用。这些引用类型允许程序员在特定场景下干预垃圾收集过程,以达到更精细的内存管理。 1. **强引用(Strong Reference)** - *...

    java弱引用

    在 Java 中,引用可以分为四类:强引用、软引用、弱引用和虚引用(也称为精灵引用)。弱引用是其中的一种,它们允许垃圾回收器在某些情况下回收对象,而不是像强引用那样坚持对象的存在。 弱引用的工作原理是,当...

    浅谈C语言中的强符号、弱符号、强引用和弱引用

    首先我表示很悲剧,在看《程序员的自我修养–链接、装载与库》之前我竟不知道C有强符号、弱符号、强引用和弱引用。在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样感觉的朋友交流也希望...

    掌握Objective-C中的弱引用:释放内存的优雅之舞

    在这段代码中,我们首先定义了一个 `UILabel` 的强引用 `label`,然后定义了一个指向 `self` 的弱引用 `weakSelf`。在异步回调中,我们通过 `__strong` 关键字将 `weakSelf` 转换回强引用 `strongSelf`,并在检查 `...

    使用Java强引用和垃圾回收实现一个简单的缓存系统.txt

    在Java中,对象的引用分为四种不同的类型:强引用、软引用、弱引用和虚引用。本示例中主要关注的是强引用。强引用是最常用的引用类型,它通过直接保存对象实例的方式来保持对对象的访问。只要强引用存在,垃圾收集器...

    关于block的循环引用

    - 使用弱引用:在Block内部,可以将`self`声明为`__weak`或`weakSelf`,防止Block对`self`的强引用。这样,即使Block仍然存在,只要没有其他强引用,`self`的引用计数仍可以降为0并被释放。 - 使用`__unsafe_...

    10分钟带你理解Java中的弱引用

    Java中存在四种引用级别:强引用、软引用、弱引用和虚引用,弱引用位于这些级别中间,比软引用弱,比虚引用强。 1. 强引用(Strong Reference):最常见的引用类型,通过`new`关键字创建的对象引用即为强引用。只要...

    Java引用总结--StrongReference、SoftReference、WeakReference、PhantomRef

    Java从1.2版本开始引入了四种引用,分别是强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)。这四种引用的级别由高到低依次为:强引用 > 软引用 > 弱引用...

    自动引用计数.playground.zip

    1. 强引用(Strong Reference):默认情况下,变量对对象的引用是强引用。当一个对象被强引用时,它的引用计数会增加。 2. 弱引用(Weak Reference):弱引用不会增加对象的引用计数,且不阻止对象的销毁。当对象的...

    如何解决Java的循环引用问题

    即使有弱引用指向一个对象,只要这个对象没有其他强引用,垃圾回收器就会在下一次回收时将其回收。修改上述示例代码,使用弱引用可以避免循环引用: ```java public class A { public WeakReference<B> bRef; } ...

    Java引用类型编程开发技术共13页.pdf.zip

    一旦没有任何强引用或软引用指向对象,即使是弱引用,该对象也会被立即回收。 8. 虚引用(Phantom Reference):虚引用并不直接与对象相关联,只在对象被垃圾收集后,通过虚引用可以知道对象已被回收。主要用于跟踪...

    Java对象的引用.pdf

    软引用是一种比弱引用更强的引用,只有在JVM认为内存不足的情况下,才会回收被软引用关联的对象。这种方式适用于创建缓存对象,比如在内存空间允许的情况下缓存图片或者大对象,而在系统内存不足时则可以被释放。...

    ios-block循环引用的三种解决办法.zip

    这里,weakSelf是self的弱引用,当Block试图访问self时,会先将其转换为强引用strongSelf。如果self已经被释放,strongSelf会变为nil,防止Block继续引用self。 三、Block内部使用__unsafe_unretained 另一种方法是...

    函数weak属性理解_弱声明实例

    引入弱引用后,其中一个对象可以使用弱引用来指向另一个,这样在没有其他强引用存在时,系统可以正确地回收内存。 2. **观察者模式**:在事件驱动或回调机制中,观察者通常使用弱引用来订阅事件,这样当发布者被...

    Python3标准库:weakref对象的非永久引用.docx

    弱引用则不增加对象的引用计数,允许对象在不再有强引用指向它时被自动清理。 - `weakref.ref()`函数用于创建弱引用,它接收一个对象作为参数,返回一个弱引用对象。这个弱引用对象是一个代理,可以用来检查原对象...

    excel提示用户定义类型未定义怎么办.docx

    Excel中用户定义类型未定义的解决方法 ...解决Excel中用户定义类型未定义的方法是正确创建对象、引用相关库文件和使用强定义方式声明变量。这些方法可以帮助开发者避免常见的错误提示,从而提高开发效率。

    全面解析Java中的引用类型

    - **定义**:软引用比强引用稍弱,表示对象在内存充足时可以存在,但在内存不足时会被回收。 - **类表示**:通过`java.lang.ref.SoftReference`类实现。 - **用途**:常用于实现内存敏感的高速缓存,例如,当内存...

    Java基础复习笔记02对象状态、引用种类、垃圾回收形式

    1. **强引用**:这是最常见的引用类型,通常当我们通过`new`关键字创建一个对象时,即产生了强引用。只要强引用存在,垃圾收集器就不会回收掉所引用的对象。 2. **软引用**:用于描述还有用但非必需的对象。当系统...

    浅谈Java引用和Threadlocal的那些事

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

Global site tag (gtag.js) - Google Analytics