zoukankan      html  css  js  c++  java
  • java对象几种引用(reference)的分析(待后期完善)

    java对象的引用reference分为有强引用,软引用,弱引用,虚引用这几种形式。【后期再深入系统的学习并完善】

    Soft Reference(软引用)

    指到的对象,即使没有任何Direct Reference,也不会清除,一直到jvm内存不足且没有Direct Reference时候才会清除。

    应用场景:常用来设计缓存,不但可以将对象缓存起来,也不会容易造成内存不足。

    Weak Reference(弱引用)

    GC一旦发现了弱引用关系进行就开始收集对象。

    应用场景:想查看某些对象信息,又不想影响GC对其的收集工作。

    与GC的交互:

    1.将referent置为null引用;

    2.将堆中的目标对象设置为“finalizable(可结束的)”;

    3.先执行finalize(),释放内存,软引用添加到RefernceQueue中。

    ReferenceQueue在 soft renference和 weak reference中可以为null,但虚应用中必须有!

    PhantomReference(虚引用)

    与GC的交互:

    1.不将referent置为null引用;而是将堆中的目标对象设置为“finalizable(可结束的)”;

    2.先软引用添加到RefernceQueue中。然后收集对象,释放内存

    附注:ReferenceQueue在 soft renference和 weak reference中可以为null,但虚引用中必须有!

    抽象类Reference分析

    java.lang.ref包中有四个类,他们的关系是PhantomReference,WeakReference,SoftReference继承了抽象类Reference。Reference类中,有thread子类(ReferenceHandler),并在静态区域中开启,对pending字段进行实时的监控。

    pending是由jvm来赋值的,当Reference内部的referent对象的可达状态改变时,jvm会将Reference对象放入pending链表。

    一旦relevent= null,垃圾收集时会标记WeakReference的referent为不可达get()返回null,并且通过 赋值给pending ,触发ReferenceHandler线程处理pending。

    ReferenceHandler线程要做的是将pending对象enqueue,但默认我们所提供的queue,也就是从构造函数传入的是null,实际是使用了ReferenceQueue.NULL,Handler线程判断queue为ReferenceQueue.NULL则不进行操作,只有非ReferenceQueue.NULL 的queue才会将Reference进行enqueue。

  • 相关阅读:
    Python爬虫爬取网页图片
    Python爬虫爬取贴吧的帖子内容
    Android导入AS工程
    Arcgis for Silverlight学习(一)
    Silverlight学习笔记之页面跳转
    视频信号的垂直消隐和水平消隐[转]
    【DM642学习笔记八】色度重采样
    java从入门到卖肠粉系列
    [Selenium] Automation Test Manual(Selenium)
    [Selenium] Selenium私房菜(新手入门教程)
  • 原文地址:https://www.cnblogs.com/luyi/p/2085699.html
Copyright © 2011-2022 走看看