Java
中一共有
4
种类型的引用
: StrongReference
、
SoftReference
、
WeakReference
以及
PhantomReference (
传说中的幽灵引用
).
这
4
种类型的引用与
GC
有着密切的关系
,
让我们逐一来看它们的定义和使用场景
:
1. Strong Reference
StrongReference
是
Java
的默认引用实现
,
它会尽可能长时间的存活于
JVM
内,
当没有任何对象指向它时
GC
执行后将会被回收
2.
WeakReference
WeakReference
,
顾名思义
,
是一个弱引用
,
当所引用的对象在
JVM
内不再有强引用时
, GC
后
weak reference
将会被自动回收
3.
SoftReference
SoftReference
于
WeakReference
的特性基本一致,
最大的区别在于
SoftReference
会尽可能长的保留引用直到
JVM
内存不足时才会被回收
(
虚拟机保证
),
这一特性使得
SoftReference
非常适合缓存应用
4.
PhantomReference
Phantom Reference(
幽灵引用
)
与
WeakReference
和
SoftReference
有很大的不同
,
因为它的
get()
方法永远返回
null,
这也正是它名字的由来
PhantomReference
唯一的用处就是跟踪
referent
何时被
enqueue
到
ReferenceQueue
中
.
PhantomReference
有两个好处:
其一,
它可以让我们准确地知道对象何时被从内存中删除,
这个特性可以被用于一些特殊的需求中
(
例如
Distributed GC
,
XWork
和
google-guice
中也使用
PhantomReference
做了一些清理性工作
).
其二,
它可以避免
finalization
带来的一些根本性问题
,
上文提到
PhantomReference
的唯一作用就是跟踪
referent
何时被
enqueue
到
ReferenceQueue
中
,
但是
WeakReference
也有对应的功能
,
两者的区别到底在哪呢
?
这就要说到
Object
的
finalize
方法
,
此方法将在
gc
执行前被调用
,
如果某个对象重载了
finalize
方法并故意在方法内创建本身的强引用
,
这将导致这一轮的
GC
无法回收这个对象并有可能
引起任意次
GC
,
最后的结果就是明明
JVM
内有很多
Garbage
却
OutOfMemory
,
使用
PhantomReference
就可以避免这个问题,
因为
PhantomReference
是在
finalize
方法执行后回收的,也就意味着此时已经不可能拿到原来的引用
,
也就不会出现上述问题
,
当然这是一个很极端的例子
,
一般不会出现
.
Soft vs Weak vs Phantom References(taken from
http://mindprod.com/jgloss/phantom.html
)
Type
|
Purpose
|
Use
|
When GCed
|
Implementing Class
|
Strong Reference
|
An ordinary reference. Keeps objects alive as long as they are referenced.
|
normal reference.
|
Any object not pointed to can be reclaimed.
|
default
|
Soft Reference
|
Keeps objects alive provided there’s enough memory.
|
to
keep objects alive even after clients have removed their references
(memory-sensitive caches), in case clients start asking for them again
by key.
|
After a first gc pass, the JVM decides it still needs to reclaim more space.
|
java.lang.ref.
SoftReference
|
Weak Reference
|
Keeps objects alive only while they’re in use (reachable) by clients.
|
Containers that automatically delete objects no longer in use.
|
After gc determines the object is only weakly reachable
|
java.lang.ref.
WeakReference
java.util.
WeakHashMap
|
Phantom Reference
|
Lets you clean up after finalization but before the space is reclaimed (replaces or augments the use offinalize())
|
Special clean up processing
|
After finalization.
|
java.lang.ref.
PhantomReference
|
分享到:
相关推荐
Java in a Nutshell Java Language Reference Java AWT Reference Java Fundamental Classes Reference Exploring Java Combined Index Combined Search Web Version Credits
Your author likes to read reference manuals (believe it or not)—at least if they are reasonably complete—on the grounds that this is the most efficient way to absorb a language quickly.
Java reference sheet
是一篇JAVA关于REFERENCE类使用的一篇文章,解析透彻,可以看看
Neo4j Java Reference 3.0
Java: The Complete Reference, Eleventh Edition By 作者: Herbert Schildt ISBN-10 书号: 1260440230 ISBN-13 书号: 9781260440232 Edition 版本: 11 出版日期: 2018-12-12 pages 页数: (1955) The Definitive ...
neo4j-java-reference-3.3neo4j-java-reference-3.3neo4j-java-reference-3.3
Java The Complete Reference 10th Edition Java9 编程官方参考(第10版) 带书签 文字版
伯克利:A Java Reference Paul N. Hilfinger University of California, Berkeley 1 Java Overview 9 1.1 Basic Program Structure . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2 Compilation and ...
Java The Complete Reference 9th pdf
spring-javaconfig-reference Spring JavaConfig Reference Guide Version 1.0.0.m3 Copyright © 2005-2008 Rod Johnson, Costin Leau, Chris Beams About this document 1. Document structure Part I, ...
Java The Complete Reference, 11th Edition 9781260440232 c.pdf Java The Complete Reference, 11th Edition 9781260440232 c.pdf Java The Complete Reference, 11th Edition 9781260440232 c.pdf
Java AWT 教程
主要为大家详细解析了Java Reference源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Java Quick Syntax Reference
neo4j-java-reference-3.1(neo4j官方Java开发指南)..
JAVA Programming Guide - Quick Reference
中文译名是J2SE参考大全(第5版) 这份是自己制作的电子书,现在还没有制作完成,因为内容太多,关打字就打个半死.
Java in a Nutshell A Desktop Quick Reference, 7th Edition