`
Mysun
  • 浏览: 270788 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java中Soft,Weak,Phantom应用的区别和使用

阅读更多
  Java 1.2版本之后加入的这三个引用类型其实是对java中对象生命周期的一个增强,使得java对象的生命周期更加丰富。这三个引用类型主要在Java虚拟机的垃圾收集阶段发挥作用。
  垃圾收集器对待软、弱和影子对象的方法不同,因为每一种都被设计用来为程序提供不同的服务。软引用使你可以创建内存中的缓存。它与程序的整体内存需求相关。弱引用使你可以创建规范映射,比如哈希表,它的关键字和值在没有其他程序部分的引用时可以从隐射中清除,而影子引用使你可以实现除终结方法以外的更加复杂的临终清理政策。
  使用一个软引用或者弱引用的引用目标,可以调用引用对象的get()方法。如果引用目标还没有被清除,则会得到对引用目标的一个强引用,就可以用通常的办法去使用它了。如果引用目标已经被清除,则会返回null。如果调用影子引用对象的get()方法,那么无论如何只能得到null,即使引用对象还没有被清除。因为影子可触及状态只有经过可复活状态之后才能获得,一个影子引用对象没有提供任何放啊飞来访问它的引用目标。调用影子引用对象的get()方法只能得到null,即使影子引用还没有清除。因为,如果它返回一个可触及对象的强引用,实际上它就复活了这个对象。这就是说,如果一个对象达到了影子可触及状态,它就无法被复活了。
  虚拟机的实现需要在抛出OutOfMemoryError之前清除软引用,但在其他情况下可以自行选择清理的时间或者是否清除它们。一般的实现都会内存块耗尽时才去清除软引用对象,而且清除的时候是先清除老的而不是新的。因为这样才能最好地发挥软引用作为内存缓存的作用。
  软引用可以让你在内存中缓存那些需要从外部数据源费时取回的数据,比如文件、数据库链接等等。所以只要虚拟内存有足够的内存,那就会在堆中保存所有的强应用数据和软引用数据。只有当内存不够用时,垃圾收集器才会去清除软引用,回收被软引用及其引用的对象或者数据占据的空间。下一次程序需要使用这个对象或者数据的时候,就必须重新进行加载。同时,虚拟机就有更多的空间来调整强引用或者其他软引用需要的内存。这对于内存比较紧张,而又要求有较高性能的情况比较适用。
  弱引用类似于软引用,只不过垃圾收集器必须在判断出对象处于弱可触及状态时立即清除弱引用所引用的对象。弱引用使得你可以用关键字和值来创建规范映射。java.util.WeabHashMap类就是用弱引用提供这样的规范映射。在WeakHashMap中,关键字对象是通过一个关联到引用队列的弱引用实现的。如果垃圾收集器判定某个关键字对象是弱可触及的,它就会清除引用并且把任何弱引用到该对象的引用加入到各自的队列中(引用队列)。下一次当WeakHashMap被访问时,它从引用队列里面拉出所有垃圾收集器放在那里的弱引用对象,然后清除WeakHashMap中任何关键字属于队列中弱引用的键-值对。这就是说,如果是把一个键-值对加入到WeakHashMap,在程序显示地使用remove()方法移出它或者垃圾收集器发现关键字对象是弱可触及之前,它会一直保留在WeakHashMap中。这对于内存有限的情况比较适用,因为在java中,如果将对象放在一般的HashMap中,虚拟机会认为该对象是强可触及的,即使没有除了HashMap对象之外的其他对象使用到该对象。使用弱引用时,就可以避免这种情况。虚拟机一旦发现弱引用的对象没有被其他对象使用,就会垃圾收集他们,节约内存。
  影子可触及性表示对象即将被回收。当垃圾收集器判定影子引用对象的引用目标处于影子可触及状态时,它把该影子引用加入到所关联的引用队列。(和软引用对象、弱引用对象不同,软引用对象和弱引用对象可以在创建时选择不和一个引用队列关联,而影子引用对象没有一个关联的引用队列就无法创建实例。)可以利用引用队列中影子引用的到达来触发一些你希望在对象生命周期的最后时刻需要完成的动作(通过注册,在影子引用到达队列时得到虚拟机发出的异步信号)。因为无法获得对影子可触及对象的强引用(get()方法总是返回null)所以无法完成那些需要访问影子目标的实例变量的动作。在完成了影子可触及对象的临终清理之后,必须调用只想它的影子引用对象的clear()方法。调用一个影子引用对象的clear()方法是对它的引用对象的致命一击,把引用目标从影子可触及状态导向它的终点:不可触及状态。(所以说,利用影子引用是没有办法操作被引用对象本身的,只能做一些与被引用对象相关的,但是又不需要被引用对象参与的善后处理动作。因此,影子引用更像是一个java虚拟机对外暴露的终结对象前的回调标记接口。通过这个接口,你可以在一个对象被销毁之前得到通知,然后做一些处理。这可能是Sun因为考虑到java虚拟机的垃圾回收机制不受程序员控制的关系而衍生出来的一种这种方案。)
分享到:
评论

相关推荐

    ARM 之十一__weak 代码 WEAK.7z

    博文 ARM 之十一__weak 和 __attribute__((weak)) 关键字的使用 的测试代码,备用!

    weak 决策树训练及测试应用步骤

    weak 对决策树算法的实际应用 有训练和测试两部分,如果你是数据挖掘的新手,那么这个文档会告诉你如何使用weka用于实际的算法进行挖掘,保证让你满意

    weak应用程序,数据挖掘平台

    用户可以直接使用这个平台,给大家带来了方便.

    Java开发规范(通用)

    这是一个很全面的Java开发规范,涉及到命名规则,常量定义,格式制约,oop,集合处理,并发处理,控制语句,注释规约,接口文档,异常处理,日志规约,建表规约,索引规约,SQL规约,orm规约,安全规约,git版本控制...

    weak操作入门(数据挖掘)

    让你轻松掌握weka操作方法,以便进行数据挖掘,这是简单介绍怎么使用这个软件的一个文档

    java7帮助文档

    Java Platform Standard Edition 7 Documentation What's New Documentation Release Notes Tutorials and Training The Java Tutorials Java Training More Information Java SE 7 Names and ...

    理解Java中的弱引用(Weak Reference)

    本篇文章尝试从What、Why、How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义、基本使用场景和使用方法。由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出,谢谢大家:)  1....

    strong-soft-weak:各种Java参考的示例

    使用“软”,“弱”和“幻影”引用的示例。 您可以在我的文章中阅读有关各种Java引用的信息:Java中的

    weak galerkin finite element meathods on polytopal

    weak galerkin finite element meathods on polytopal

    Weak Signal Digital GNSS Tracking Algorithms.pdf

    9、Weak Signal Digital GNSS Tracking Algorithms 10、Fundamentals of Global Positioning System Receivers II 11、Composite GNSS Signal Acquisition over Multiple Code Periods 12、GPS接收机电路设计 13...

    The strength of weak learnability.pdf

    The strength of weak learnability.pdf

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

    学习理解函数加上weak后的变化

    Practical Weak Supervision.pdf

    在这本书中,Wee Hyong Tok, Amit Bahree和Senja Filipi向您展示了如何使用弱监督学习模型创建产品。 您将学习如何使用来自Snorkel的弱标记数据集构建自然语言处理和计算机视觉项目,Snorkel是斯坦福人工智能实验室...

    Weak-Password.zip

    压缩包包含了常见的弱口令用户名,弱口令密码。包含常见的服务ftp、telnet、mysql等。还有sql注入测试代码。

    iOS 中weak的实现代码示例

    接下来,我们会从 objc 库中的 NSObject.mm、 objc-weak.h 以及 objc-weak.mm 文件出发,去具体了解 weak 的实现过程。 weak 的内部结构 Runtime 维护了一个weak表,用于存储指向某个对象的所有weak指针。weak 表是...

    weak-ptr 和 shared-ptr 源码

    关于C++智能指针 weak_ptr (弱引用 智能指针) 和 shared_ptr (强引用 智能指针)的源文件。 资源分不能设为0了。。

    提高Java代码性能的各种技巧

    Java 6,7,8中的String.intern–字符串池  这篇文章将要讨论Java 6中是如何实现String.intern方法的,以及这个方法在Java 7以及Java 8中做了哪些调整。...  很多标准禁止在Java 6中使用String.intern()

    java集合-WeakHashMap的使用

    WeakHashMap是Java中的一种特殊的哈希表实现,它使用弱引用(Weak Reference)来保存键对象。当键对象没有被其他强引用引用时,在垃圾回收时会自动从WeakHashMap中移除对应的键值对。

    Carrier loop architectures for tracking weak GPS signals.pdf

    Carrier loop architectures for tracking weak GPS signals.pdf, The performance of various carrier recovery loop architectures (phase lock loop (PLL), Doppler-aided PLL, frequency lock loop (FLL), and ...

    weak,Strong指针小结

    ARC的判断准则: 只要没有强指针指向对象,就会释放对象,弱指针不会这样,及时有弱指针指向对象,对象没有强指针指向,也会自动释放掉。一般,无需显式声明为强指针,但是在封装里,定义方法的时候需要写明。...

Global site tag (gtag.js) - Google Analytics