分析java对象的几种引用(reference)

开发 后端
本文介绍的是java对象的引用的分析,希望对大家有帮助,一起来看吧!

java对象的引用reference分为有强引用,软引用,弱引用,虚引用这几种形式。

1、Soft Reference(软引用)

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

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

2、Weak Reference(弱引用)

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

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

与GC的交互:

1.将referent置为null引用;

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

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

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

3、PhantomReference(虚引用)

与GC的交互:

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

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

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

4、抽象类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。

希望通过以上内容的介绍,能够给你带来帮助。

责任编辑:于铁 来源: 互联网
相关推荐

2011-07-22 15:12:12

java

2009-06-19 16:19:23

Java对象引用

2009-12-03 09:59:20

JVM概念Java对象引用类型

2022-01-12 09:08:37

索引JavaReference对象

2015-11-16 11:22:05

Java对象内存分配

2021-10-18 15:50:49

Android强引用软引用

2009-09-09 09:36:25

Linq对象引用

2009-08-17 14:48:44

Java参数传递机制

2023-12-25 09:30:41

Java垃圾回收

2019-12-12 15:39:28

大数据IT互联网

2011-06-30 09:25:22

软件项目

2009-09-02 16:02:52

C#引用托管对象

2020-12-02 09:01:40

Java基础

2017-02-27 11:48:58

JVM源码分析Java

2010-01-20 18:24:51

C++CLI

2021-07-15 08:58:16

Spring对象引用

2021-03-06 19:45:23

项目文件代码

2011-09-22 13:49:44

XML基准测试

2011-05-17 10:33:44

IE6

2020-08-24 08:05:47

JavaScriptJavaScript 页面
点赞
收藏

51CTO技术栈公众号