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
|
分享到:
相关推荐
从ArrayList、LinkedList到HashMap、HashSet,每种集合类型的创建、操作和使用场景都有详尽的解释。此外,还包括了泛型、迭代器和比较器等高级话题,帮助开发者更高效地处理数据结构。 Java异常处理是另一个重要的...
- Java的类路径使用`-cp`或`-classpath`参数指定,而C#则使用`/reference`选项。 - Java程序的执行入口是`main`方法,C#则为`Main`方法,注意C#中的`Main`方法可以是静态的也可以不是。 2. 部署应用程序 - Java...
《Java The Complete Reference 11 Edition》是一本深入讲解Java编程语言的经典著作,适用于初学者和有经验的程序员。本书全面覆盖了Java的各个方面,包括基础语法、面向对象编程、集合框架、多线程、网络编程、I/O...
《Java编程思想》是 Bruce Eckel 编著的一本经典Java教程,这本书深入浅出地讲解了Java语言的核心概念和编程技巧。书中的练习题旨在帮助读者巩固所学知识,提高编程技能。以下是对这些练习题及参考答案的详细解析: ...
7. **反射与动态代理**:了解如何在运行时检查和修改类、接口、对象的属性和方法,以及动态代理的使用场景和实现方式。 8. **泛型**:学习泛型的引入,其目的、限制和好处,以及泛型类、泛型方法和通配符的使用。 ...
本文将重点介绍Java中的基本类型,并详细阐述每种类型的字节长度、取值范围及应用场景。 #### 二、基本类型详解 ##### 1. Byte类型 - **字节长度**:1字节(8位) - **取值范围**:-128~127 - **应用场景**: - ...
本文档名为“hibernate_reference.pdf”,其描述表明它是一份与“JSR 303 Reference Implementation Reference Guide 4.0.1.GA”相关的指南,重点介绍Hibernate Validator作为JSR 303的参考实现。JSR 303是Java社区...
- Java 虚拟机中还包括 `reference` 类型,用于表示对象引用。 26. **创建实例的方式** - 除了使用 `new` 关键字之外,还可以通过反射、克隆等方法创建对象实例。 27. **ClassLoader加载方式的区别** - 不同的 ...
6. call by value不会改变实际参数的值,而call by reference可以改变实际参数的引用地址,但这在Java中并不存在,Java采用的是call by value(值传递)模型,但对象引用是按值传递的。 7. 错误的说法包括在类方法...
- **包**: 类似于Java中的包(package),用于组织和分类源文件。 - **控制流**: 包括条件语句(if/else)、循环(for/while)等。 - **返回与跳转**: 如return、break、continue等控制流程的关键字。 - **类与对象**: ...
本篇文章将详细介绍Java中的基本数据类型,包括它们的分类、大小、范围以及使用示例。 1. 整型数据类型: - byte:占用1个字节(8位),存储的数值范围是-128到127,适用于节省内存空间的场景。 - short:占用2个...
总结,Java技术面试中关于分布式开发的问题主要集中在分布式系统的原理、关键技术以及具体实现框架上,特别是像Dubbo这样的流行框架,其开发流程和使用方法是考察的重点。同时,深入理解RPC协议及其在网络通信中的...
- **type** [taip]:在 Java 中,“type”指的是数据的种类,例如 int、double 或 String 等。 #### 第三章:逻辑与流程控制 - **Boolean** ['bu:li:ən]:表示布尔类型,只有 true 和 false 两个值。 - **true** ...
垃圾收集是Java内存管理的一个重要方面,它能够自动回收堆内存中不再使用的对象,减少内存泄漏的风险。本手册提供了一个全面的指南,旨在帮助读者理解Java中垃圾收集的工作原理,掌握不同垃圾收集器的特点,以及如何...
【标签】为空,意味着没有提供额外的分类或关键词来描述这个压缩包的具体技术特点或应用场景。 【压缩包子文件的文件名称列表】:虽然未提供具体的文件名,但一般情况下,一个源码压缩包可能包含以下类型的文件: ...
JasperReports支持多种数据源,包括Java集合、数据库连接(JDBC)、XML数据源、CSV文件等。数据源定义了报表的数据来源,可以动态地从各种数据提供者获取数据。 **4. 表达式与变量** 表达式是JasperReports的核心,...
### Esper Adapter Reference:...总之,Esper 4.3.0中的Adapter不仅种类繁多,而且功能强大,可以满足不同场景下的数据处理需求。通过对这些Adapter的学习和掌握,开发者可以充分发挥Esper在实时数据分析领域的潜力。