WeakReference回收问题

这个类算是一种标记,和C的指针给人的感有点像,但是起的作用可能比指针要大。我们都知道,java虚拟机的垃圾回收算法为可达性分析算法,即在回收垃圾前对垃圾进行分析和标记,然后这个标记的过程就是关键。

亲爱的朋友,我们都知道WeakReference是在下一次gc的时候会将WeakReference所指向的内容回收,然后SoftReference则是在full gc的时候才会将指向的内容回收,那么问题就来了。reference真的这么蠢吗?也就是如果不仅仅只有reference引用了对应的实例,在可达性分析算法的root节点依然有对于这个实例的引用,这种情况下,reference通过get的结果会是空吗?

怎么可能会是空呢?我们理一下逻辑就可以知道,其实所谓reference的作用其实就仅仅是在回收的时候提供一个标记,即如果在一般gc的情况下,发现某个实例有被softreference引用,那可达性分析就会判定这个对象不应该被回收,即其起到的作用大概可以被归纳为两点:

  1. SoftReference可以拯救在gc中本应该被回收的实例
  2. WeakReference可以确保一些实例在不需要的时候,及时地被抛弃

看看如下的例子,看看输出结果,相信你会有答案的。

class TestReferecnce {@Test@Throws(Exception::class)fun testSomething() {var urlPatternTest:UrlPatternTest? = UrlPatternTest()val reference = WeakReference(urlPatternTest)reference.get().doIfNotNull { println("target exist") }println("execute gc")System.gc()reference.get().doIfNotNull { println("target exist") }reference.get().doIfNull { println("target not exist") }println("\n\nexecute gc after set null")urlPatternTest = nullSystem.gc()reference.get().doIfNotNull { println("target exist") }reference.get().doIfNull { println("target not exist") }}
}
target exist
execute gc
target existexecute gc after set null
target not existProcess finished with exit code 0

WeakReference回收问题相关推荐

  1. hutool使用 WeakReference

    Full GC .Major GC和 Minor GC有什么不同  我们见过很多 GC 名词如:Minor GC.Young GC.Full GC.Old GC.Major GC.Mixed GC等. ...

  2. 深入探讨 java.lang.ref 包

    http://www.ibm.com/developerworks/cn/java/j-lo-langref/ 概述 Java.lang.ref 是 Java 类库中比较特殊的一个包,它提供了与 Ja ...

  3. java ref object_深入探讨 java.lang.ref 包

    概述 Java.lang.ref 是 Java 类库中比较特殊的一个包,它提供了与 Java 垃圾回收器密切相关的引用类.这些引用类对象可以指向其它对象,但它们不同于一般的引用,因为它们的存在并不防碍 ...

  4. WeakReference:防止内存泄漏,要保证内存被虚拟机回收。

    首先我们来看一段代码 public class AutoActivity extends Activity { Handler handler = new Handler(){public void ...

  5. Android 弱引用 (WeakReference)的使用

    1 弱引用 (WeakReference) 弱引用对象,这些对象不会阻止对其引用对象进行终结,终结和回收.弱引用最常用于实现规范化映射.假设垃圾收集器在某个时间点确定对象是弱可到达的.到那时,它将自动 ...

  6. JVM:垃圾回收相关概念

    文章目录 System.gc()的理解 内存溢出与内存泄漏 内存溢出(OOM) 内存泄漏(Memory Leak) Stop The World 垃圾回收的并行与并发 并发(Concurrent) 并 ...

  7. 假期三天,我肝了万字的Java垃圾回收,看完你还敢说不会?

    大家好,我是狂聊,上一篇已经把 Jvm 的运行区数据和类加载机制聊完了. 今天来说说 Java 垃圾回收,高频面试问题. 提纲附上,话不多说,直接干货 1.什么是垃圾回收? 垃圾回收(Garbage ...

  8. Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector

    文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...

  9. Java内存回收机制基础[转]

    原文链接:http://blog.jobbole.com/37273/ 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了J ...

最新文章

  1. 简单实现ConfigurationManager.AppSettings[]效果存储系统变量
  2. Linux Shell命令能力倾向问题和解答
  3. 小红旗图标在excel如何输入_excel数据核对技巧:如何用函数公式标识输入正误...
  4. mac 本地安装mysql_mac 本地安装mysql服务
  5. Error creating object Microsoft Data Access Components 2.1 (or later) have been properly installed
  6. 【JavaScript 封装库】BETA 1.0 测试版发布!
  7. C++迭代器(STL迭代器)
  8. Oxygen XML Editor Professional文档的强大工具
  9. Xmarks不会关闭了,太好了!
  10. DNS污染是什么意思?DNS污染解决方案
  11. gprs模块与服务器通信协议,gprs模块与服务器通信原理分析
  12. apple id是什么意思
  13. 关于 vue3.0 实战项目 setup、 props、 reactive、ref
  14. 2010年显卡行业大事
  15. 带你了解Google搜索引擎的竞价排名是怎样实现的?
  16. 诓”妹妹与“旺”夫君
  17. java中sql查重跟去重_sql中查重和去重
  18. uvm register model
  19. Android开发软件Eclipse安装教程
  20. 【机器学习】详解 ResNeSt

热门文章

  1. 安卓4.4.4安装哪个微信版本_微信一个开关,速度立马提升一倍
  2. 欢迎使用CSDN-markdown编辑器·211
  3. Android怎么设置主活动,如何从另一个活动启动Android AppWidget的配置活动?
  4. php点选按钮ajax,php – 在单选按钮上显示div中的数据单击ajax
  5. 3d饼图 vue_这是我见过最优雅的Vue图片轮播插件——Vue-Awesome-Swiper
  6. Elasticsearch-PHP实战操作
  7. 【高级Java架构师系统学习】java问答社区系统
  8. Android移动开发之【Android实战项目】activity生命周期与Java中@Override的作用
  9. python【蓝桥杯vip练习题库】ADV-136大数加法(高精度加法)
  10. vant weapp 多选上传图片_iPhone竟然可以压缩图片?一秒1.7MB瞬间变0.08MB,太逆天了吧...