Java中的引用方式有StrongReference, SoftReference, WeakReference和PhantomReference。先来看一个来mindprod
的一个图表:
Soft vs Weak vs Phantom References
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 of finalize
()) |
Special clean up processing |
After finalization. |
java.lang.ref.
PhantomReference
|
1、StrongReference:
是Java中默认的引用方式。当它指向某个对象时,该对象不会被回收;当它不再指向该对象,且该对象没有其它的引用指向时,在GC被执行后,可以回收该对象所占用内存。
代码示例1:
// 在栈内存创建Object的引用
Object object = null;
// 在堆内存创建Object对象,并使object引用指向刚刚创建的Object对象
object = new Object();
执行完上述代码,内存分布如下图:
如果此时系统调用GC,object指向的对象不会被回收。
代码示例2:
// 断开引用
object = null;
执行完上述代码,内存分布如下图:
如果此时系统调用GC,断开object指向前的那个对象会被回收。
2、SoftReference:
当JVM内存不足时,SoftReference指向的对象会被回收。这样的特性,使得SoftReference适合应用到缓存操作。
使用方式:
Object object = new Object();
SoftReference<Object> softRerference = new SoftReference<Object>(object);
object = null;
3、WeakReference:
当所引用的对象不再有强引用时, 系统调用GC后,该对象会被回收。使用方法类似SoftReference。WeakHashMap的key的类型是WeakReference, 如果没有指向key的强引用,在系统调用GC后,WeakHashMap会删除相关的value对象并回收。
代码示例:
// 创建并指向WeakHashMap
Map<Object, Object> weakHashMap = new WeakHashMap<Object, Object>();
// 创建并指向key
Object key = new Object();
// 创建并指向value
Object value = new Object();
// 添加key-value对到WeakHashMap
weakHashMap.put(key, value);
// 断开key的强引用
key = null;
4、PhantomReference:
注意它与finalize方法调用的时机。
5、多说一句
:这些引用方式都具有自己的特性,根据它们的特性完成某个特定的功能!:)
- 大小: 11 KB
- 大小: 10 KB
分享到:
相关推荐
对于基本类型,Java采用值传递的方式,而对于引用类型,则是传递引用的副本。 1. 值传递与引用传递的区别: - **值传递**:当传递基本类型参数时,实际传递的是该变量的值的一个拷贝。例如,对于一个布尔值`...
从JDK 1.2版本开始,Java引入了一种更为精细的引用类型管理机制,通过四种不同的引用类型:强引用、软引用、弱引用和虚引用,让开发者能够更加灵活地控制对象的生命周期。这种机制不仅提升了Java应用程序对内存使用...
这是最常见的引用类型,也是默认的引用方式。只要对象被至少一个强引用指向,那么它就不会被垃圾回收器回收。即使当系统内存不足时,Java虚拟机(JVM)也会抛出`OutOfMemoryError`,而不是回收这些对象。因此,...
对于对象的参数传递,Java采用的是引用传递的方式。这意味着当你传递一个对象作为参数时,实际上是传递了对该对象的引用,而不是对象本身的副本。因此,在方法内部对这个对象所做的任何改变都会反映到原始对象上。 ...
在Java中,对象的引用方式对于内存管理和对象生命周期的控制至关重要。从JDK 1.2版本开始,Java引入了四种不同级别的引用:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚...
### 浅析Java引用类型和方法参数传递 #### 一、引言 在Java编程语言中,理解数据类型的处理方式对于编写高效、可维护的代码至关重要。本文将深入探讨Java中的引用类型及其如何影响方法参数的传递机制。通过具体实例...
在Java编程语言中,函数调用时的参数传递方式有两种:传值(Passing by Value)和传引用(Passing by Reference)。虽然Java官方文档中并未明确指出有传引用这一概念,但在实际操作中,Java的行为类似于传引用,尤其...
总结来说,Java的引用类型提供了一种控制对象生命周期的方式,使得开发者可以在内存管理和性能之间做出权衡。正确使用这些引用类型可以避免内存泄漏,同时优化应用程序的性能。在设计缓存、资源池等场景时,理解并...
- 强引用是Java中最常见的引用类型,它是默认的引用方式。只要一个对象被强引用指向,那么它就不会被垃圾收集器回收,即使系统内存不足,Java虚拟机(JVM)也会抛出`OutOfMemoryError`,而不是回收这些对象。 - ...
在Java编程语言中,关于参数传递的方式一直存在两种观点:一种认为Java仅支持按值传递,另一种则指出Java同时支持按值传递和按引用传递。实际上,这两种观点并非完全对立,而是根据不同的角度来描述Java中的参数传递...
### Java引用变量传递诡异之处详解 #### 背景与问题描述 在Java编程语言中,对于引用类型变量的理解及其实现方式一直是开发者们容易混淆的地方。尤其是当涉及到方法调用过程中引用变量的传递时,更是如此。本文将...
弱引用是 Java.lang.ref.WeakReference 类的实例,它们提供了一种方式来引用对象,而不阻止垃圾回收器回收这些对象。 在 Java 中,引用可以分为四类:强引用、软引用、弱引用和虚引用(也称为精灵引用)。弱引用是...
在Java编程语言中,函数参数的传递方式有两种:值传递和引用传递。理解这两种机制对于编写高效、无误的代码至关重要。以下是对这两种传递方式的详细解析。 首先,值传递是指函数调用时,实际参数的值被复制一份传给...
了解Java中对象的传递方式和克隆机制对于编写高效、安全的代码至关重要。浅拷贝和深拷贝的选择取决于具体的应用场景,需要根据实际情况进行权衡。通过深入理解这些概念,开发者可以更好地利用Java的强大功能来构建高...
- 对于对象,Java采用的是按值传递引用的方式,即传递的是指向对象的引用的副本。这意味着可以在方法内部修改对象的状态而不影响原始对象的引用,但如果重新赋值引用,则不会影响原始对象。 - 引用是一种数据类型,...
- **引用**:引用是用于访问对象的一种方式。简单来说,引用变量保存了对象的内存地址,通过该地址我们可以访问到对象本身。引用变量并不包含实际的对象数据,而仅仅是提供了一种手段去获取这些数据。 #### 关键点...
Java中的参数传递方式分为两种:一种是按值传递,另一种则是按引用传递。然而,Java实际上只支持按值传递,即便是对象也不例外。这里的“值”指的是基本类型的实际值,以及对象引用的值。 1. **基本类型的参数传递*...
Java支持两种基本的数据传递方式:值传递和引用传递。本文将详细介绍这两种传递方式,并通过具体的例子来说明它们的区别和应用。 #### 二、Java中的数据类型 Java中的数据类型分为两大类:原始类型(Primitive ...
### Java中的正则表达式:分组引用介绍 #### 概述 正则表达式是计算机科学中一种非常强大的文本处理工具,在Java等编程语言中广泛应用于字符串匹配、搜索替换等场景。当需要对正则表达式的部分结果进行进一步处理...
在Java编程语言中,了解值传递和引用传递的概念至关重要,因为它们直接影响到函数参数的处理方式。下面将详细探讨这两个概念及其区别。 首先,我们来理解什么是值传递。在Java中,基本数据类型(如int、double、...