Java:References:修订间差异

来自WHY42
Riguz留言 | 贡献
Riguz留言 | 贡献
第11行: 第11行:


==Phantom References==
==Phantom References==
<span class="article-label">PhantomReference</span>(虚引用)必须跟<span class="article-label">ReferenceQueue</span>一起使用。最弱,发生GC时会被回收。
===作用===
<span class="article-label">PhantomReference</span>(虚引用) 无法直接获取被引用的对象,必须跟<span class="article-label">ReferenceQueue</span>一起使用。<span class="article-label">PhantomReference</span>最弱,发生GC时会被回收,当JVM执行完<syntaxhighlight lang="java" inline>finalize</syntaxhighlight>之后,对象会被放到<span class="article-label">ReferenceQueue</span>中。




第27行: 第28行:
g = phantomRef.get();
g = phantomRef.get();
</syntaxhighlight>
</syntaxhighlight>
=== 使用场景 ===
其使用场景主要有两种:
* 检测对象何时被回收,例如在执行对内存敏感的任务的时候,等待大对象回收了再开始新的任务
* 避免直接执行<span class="article-label">finalize</span>


[[Category:Programe]]
[[Category:Programe]]

2021年4月29日 (四) 08:26的版本

Java引用类型

Strong References

默认的引用方式,即通过MyClass obj = new MyClass ();这种方式赋值的对象,如果其存在active引用的话,是不会被回收的

Weak References

如果一个对象只能被弱引用访问(不存在强引用或者软引用的情况),那么下一次GC将被清理掉。

其主要的使用场景是实现。即对于一个特定的value,map中只有一个instance。

Soft References

软引用的对象在JVM内存不足的时候会被回收掉。

Phantom References

作用

(虚引用) 无法直接获取被引用的对象,必须跟一起使用。最弱,发生GC时会被回收,当JVM执行完finalize之后,对象会被放到中。


Gfg g = new Gfg();

ReferenceQueue<Gfg> refQueue = new ReferenceQueue<>();
PhantomReference<Gfg> phantomRef = new PhantomReference<>(g, refQueue);

// 当g(强引用)不继续存在之后,对象就会被可以回收了
// 但在对象
g = null;

//It always returns null.
g = phantomRef.get();

使用场景

其使用场景主要有两种:

  • 检测对象何时被回收,例如在执行对内存敏感的任务的时候,等待大对象回收了再开始新的任务
  • 避免直接执行