原文同时还记录在笔者博客:
http://www.newhottopic.com/2013/04/05/java-reference/
Java语言里的引用类似于C/C++语言里的指针,通过引用可以对堆中的对象进行操作。在Java语言中的引用机制里,有四种引用。
一、强引用
这是最常用最普遍的一种引用。一般而言,大多数情况下默认使用的引用就是强引用。比如当你在函数体中创建了一个对象,该对象被分配在堆中,那么通过对象的引用就可以对该对象进行操作。比如:
StringBuffer str = new StringBuffer("not a hello world");
如果上述语句在函数体内运行,那么str做为局部变量是分配在栈上,但StringBuffer类的实例对象”not a hello world”则是分配在堆上。此时str指向StringBuffer实例所在的堆空间,通过str变量就可以操作该实例了,这时str就是StringBuffer的引用。
当然,如果在上述语句之后代码里还有一个赋值语句,如:
StringBuffer str1 = str;
则str1也会在栈上分配有空间存储,也是StringBuffer实例的引用,此时该实例就有两个引用。如果这时执行“==”操作,判断的是两个引用,指向的实例所在的堆空间的地址是否相同,而不是两个实例是否相同。
上面提到的都是强引用。
一般来说,强引用可以直接访问目标对象。当对象实例还有强引用指向时,就不会被JVM回收。但这样也容易有OutOfMemoryException的隐患。
二、软引用
软引用是除了强引用以外最强的引用类型。其构造使用代码如下:
StringBuffer str = new StringBuffer("not a hello world");
SoftReference<StringBuffer> softRerference = new SoftReference<StringBuffer>(str);
这里的softRerference就是对对象实例的软引用。
软引用的特点在于只有其指向的对象实例不会很快的被JVM回收,其只会在堆内存使用很紧张接近阀值时才会回收掉。只要有足够大的内存空间,软引用是可以在内存里存活的。所以这种特点让其适用于对内存空间敏感的Cache。
三、弱引用
弱引用是比软引用还弱的引用类型,使用的构造代码与软引用类似,把SoftReference改成WeakReference即可。其特点是不管内存空间使用多少,只要JVM进行GC时,发现有弱引用都会对其进行回收。当然,垃圾回收的线程优先级也比较低,如果内存足够,那么弱引用的对象也可以存活很久。
弱引用的特点使其可以适用于可有可无的缓存场景。当内存充足时缓存的对象数据可以加速系统,内存紧张时又会被回收掉。
四、虚引用(又叫幽灵引用)
虚引用、幽灵引用,顾名思义,是虚无缥缈的一种引用,是最弱的一种引用。一个对象有虚引用时,相当于没有引用,其随时都可能会被回收掉,并且其返回值永远都是null。我们看JDK源码时就会看到PhantomReference里的get()方法实现如下:
public T get(){
return null;//任何情况下都是只返回null
}
那么虚引用的存在意义是什么呢?它必须是跟引用队列(ReferenceQueue)一起使用的,用来跟踪垃圾回收的过程。
其构造使用的代码如下:
Object ref = new Object();
PhantomReference<Object> phantomReference = new PhantomReference<Object>(ref, new ReferenceQueue<Object>());
当ref被回收时,GC会让该引用进入到引用队列中,此时判断引用队列里有该对象时,我们即可做一些回收前的业务处理,比如记录日志一类的操作。
其实软引用和弱引用里也有类似用法,即构造时与一个引用队列同用,并且在被回收时GC也会将其放入队列中,那么虚引用与其的区别是什么呢? 我们知道Object 的 finalize方法是在gc执行前被调用的,如果某个对象重载了finalize方法,在其内创建本身的强引用(不管是有意的还是无意的)都将导致这一轮的GC无法回收这个对象。并有可能引起很多次GC,最后会导致JVM内有很多Garbage却OutOfMemory,使用PhantomReference就可以避免这个问题,因为PhantomReference是在finalize方法执行后回收的,也就意味着此时已经不可能拿到原来的引用,也就不会出现上述问题。
一般的应用编程不会涉及到Reference编程,但是了解这些知识会对理解GC的工作原理以及性能调优有帮助,在实现一些基础性设施比如缓存时也可能会用到。
分享到:
相关推荐
* 数据类型:Java 语言中,数据类型可以分为基本数据类型和引用数据类型。 * 运算符:Java 语言中,运算符可以用于进行算术运算、比较运算、逻辑运算等。 * 控制结构:Java 语言中,控制结构可以用于控制程序的执行...
Java语言支持两种主要的数据类型:**值类型**和**引用类型**。值类型主要包括基本数据类型(如`int`, `float`等)及其对应的包装类(如`Integer`, `Float`)。引用类型则通常指类、数组或接口等对象类型。 ##### 1....
在Java编程语言中,引用类型对于管理对象的生命周期和内存使用至关重要。自JDK 1.2以来,Java引入了四种不同的引用级别,以提供更精细的控制权。以下是这四种引用类型的详细解释: 1. **强引用(StrongReference)*...
Java提供了四种不同级别的引用类型:强引用、软引用、弱引用和虚引用(幻象引用),每种引用类型在内存管理中有不同的作用。 1. **强引用(Strong Reference)** - 强引用是最常见的引用类型,即通常的变量赋值。...
Java提供了四种不同类型的引用,每种引用都有其特定的用途和行为。本文将深入探讨这四种引用——强引用、软引用、弱引用和虚引用,以及它们在内存管理和垃圾回收中的作用。 1. **强引用(StrongReference)** - 强...
Java语言中的数据类型可以分为基本数据类型和引用类型。基本数据类型包括boolean、char、byte、short、int、long、float、double等。引用类型包括类、接口、数组等。 基本数据类型 基本数据类型是指无法再分解的...
【JAVA语言入门资料】 在IT领域,JAVA语言作为一款广泛应用的编程语言,是许多初学者的首选。这份“JAVA语言入门资料”旨在为新手提供一个系统化的学习路径,帮助他们快速掌握JAVA的基础知识和核心概念。 一、JAVA...
Java语言基础是编程学习的重要部分,它为程序员提供了构建复杂应用程序的基础。本笔记将深入探讨Java的核心概念,帮助你巩固和理解这门广泛使用的编程语言的关键要素。 首先,我们要了解Java的基本语法。Java是一种...
《Java语言程序设计》第六版基础篇是一本深入浅出的Java编程教程,它涵盖了Java编程的核心概念和技术,是初学者和进阶者都必备的参考书籍。这本书以清晰的逻辑和丰富的实例,帮助读者理解并掌握Java编程的精髓。 在...
在本资源中,我们聚焦于Java语言设计的基础篇——第八版的第四章编程题解答。这一部分的内容旨在帮助读者深入理解和应用Java编程的基本概念。Java作为一种广泛应用的面向对象的编程语言,其基础知识对于任何想从事...
### 计算机JAVA语言入门知识点详述 #### 一、JAVA语言的起源与特性 **1.1 Java的历史背景** - **1.1.1 Java的起源** - Java最初由Sun Microsystems的一位名为James Gosling的工程师领导开发,项目代号为“Green...
在基本数据类型中,Java定义了八种基本类型:四种整型(byte、short、int、long)、两种浮点型(float、double)、一种字符型(char)和一种布尔型(boolean)。整型变量用于存储整数,包括byte(1字节)、short(2...
1. **基础语法**:这是Java学习的起点,包括变量声明、数据类型(如基本类型和引用类型)、运算符、流程控制语句(如if条件语句、switch语句、for和while循环)以及方法定义。 2. **类与对象**:Java是一种面向对象...
数据类型的转换规则是Java语言中的基本规则,用于将一种数据类型转换为另一种数据类型。 五、包装类的作用 包装类是Java语言中的基本元素,用于将原始数据类型封装成对象,以便在程序中使用。 六、数据的输入和...
Java语言重要概述 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。它的设计目标是具有跨平台性、可移植性、安全性和高效性,使得Java成为开发桌面应用、Web...
这门课程涵盖了Java语言的基本语法、数据类型、控制结构、类与对象、异常处理、输入输出以及简单的多线程编程等内容。下面将对这些知识点进行详细的阐述。 1. **Java基本语法**:Java是一种强类型、面向对象的语言...
, 基于最新Java SE 8,完整且准确地阐述Java编程语言及其规范,是深度了解Java语言及其技术细节的权威参考书。, 本书由Java技术的发明者编写,是Java编程语言的权威性技术指南。如果你想知道Java语言构造的精确含义...
Java语言基础是编程学习的重要部分,它为程序员提供了构建复杂应用程序的基础。在这个“Java语言基础 详解 java实例20”中,我们将深入探讨Java的核心概念和技术,这些内容将帮助初学者建立坚实的编程基础。 首先,...