Java 引用

Java 对象的引用方式有如下四种,这四种方式主要是为了给垃圾回收提供更灵活的操作:

1、强引用,最常见的引用方式,当一个对象被一个或一个以上的引用变量引用时,它处于可达状态,这时不会被垃圾回收器回收。

2、软引用(SoftReference),通常用于内存敏感的程序中,当一个对象只有软引用时,当系统空间足够时,系统不会回收它,当系统空间不够时,系统可能回收它。

3、弱引用(WeakReference),不管系统空间是否足够,总会回收该对像所占用的内存。

4、虚引用(PhangtomReference),类似与完全没有引用,虚引用主要用于跟踪对象被垃圾回收的状态,它不能单独使用,必须和引用队列(ReferenceQueue)一起使用,当该引用的对象被垃圾回收之后,虚引用将进入引用队列中,虚引用不能通过get方法,获取正常的引用。

示例如下:

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

public class PhantomReferenceTest {

    public static void main(String[] args) {
        String str = new String("Hello World");
        ReferenceQueue referenceQueue = new ReferenceQueue<>();

        PhantomReference<String> phantomReference = new PhantomReference<String>(str, referenceQueue);

        str = null;

        System.out.println(phantomReference.get());

        System.gc();
        System.runFinalization();

        System.out.println(referenceQueue.poll() == phantomReference);
    }

}

运行结果:

null
true

虚引用不能通过虚引用访问被引用的对象,但是当垃圾回收后,虚引用进入了ReferenceQueue。

时间: 2024-10-26 05:12:32

Java 引用的相关文章

关于Java引用,你必须知道这些

引用 Java 虚拟机接管了所有的内存分配与回收工作,极大地减少了程序员的工作量和错误率.GC 在回收内存时,通常采用被称为可达性分析的算法判断一个对象是否可以回收.而在可达性分析中,对象的引用有着决定性的作用.在下图中,GC 从 GC Roots 开始顺着引用链往下寻找对象,发现当前有引用的对象为object 1.object 2.object 3.object 4,而object 5.object 6.object 7虽然互相之间有引用但已经无法从外部引用到.因此,图中 object 1-4

Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference

http://www.cnblogs.com/skywang12345/p/3154474.html 1 Java引用介绍 Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为:    强引用  >  软引用  >  弱引用  >  虚引用 ⑴强引用(StrongReference)    强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回

4种Java引用浅解

近期研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档.代码以及几篇文章.做个小结,如有错误,欢迎指正. 之所以想学习一下Java的几种引用类型,原因有两个: 理解Java Cache实现.学习Java引用与Java垃圾回收机制的关系 内存资源是有限的,须要合理的利用.Cache不是只HashMap那么简单,Java引用与Java垃圾回收机制也有很紧密的关系. 避免对Java引用的错误使用 某个同事把5000+交易数据放到一个HashMap

Java引用的种类

---恢复内容开始--- 距离第一篇貌似有很久了,md拖延症越来越严重了,不过每天十点多下班回家到家就十一点多了,就只想睡觉了.不瞎bb了,直接上干活.主要想记录一下关于java引用. 搞java的应该对引用这个词非常非常熟悉不过了,记得刚入门java的时候,这个词就一直伴随着我们.在java中又一个非常重要的东西那就是GC,对于gc来说,判断一个对象是否可回收的标志就在于该对象是不是还在被引用(关于gc下次专门记录一波),jvm为了更好的管理对象的引用,在lang.ref包下面有三个类:Sof

Java引用类型变量

Java引用类型变量 1.编译时类型:由声明该变量时使用的类型决定 2.执行时类型:由实际赋给该变量的对象决定    类型不一致的假设编译时类型和执行,可能会出现多态性 版权声明:本文博主原创文章.博客,未经同意不得转载.

Java引用变量的类型

Java引用变量的类型 1.编译时类型:由声明该变量时使用的类型决定 2.运行时类型:由实际赋给该变量的对象决定    如果编译时类型和运行时类型不一致,就可能出现多态性

Java引用和C++引用的区别

今天做错了一道笔试题,发现以前的对于Java引用理解有误,特撰文记录 题目如下: public class Tester{ public static void main(String[] args){ Integer var1=new Integer(1); Integer var2=var1; doSomething(var2); System.out.print(var1.intValue()); System.out.print(var1==var2); } public static

浅解四种Java引用

最近研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档.代码以及几篇文章.做个小结,如有错误,欢迎指正. 之所以想学习一下Java的几种引用类型,原因有两个: 理解Java Cache实现.学习Java引用与Java垃圾回收机制的关系 内存资源是有限的,需要合理的利用.Cache不是仅仅HashMap那么简单,Java引用与Java垃圾回收机制也有非常紧密的关系. 避免对Java引用的错误使用 某个同事把5000+交易数据放到一个HashM

关于Java引用jar是否支持通配符

Java引用jar执行命令: java -cp .:mysql-connector-java-5.1.24.jar:jdom-1.1.jar JavaCpTest 说明: -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号";" 分隔,linux上是分号":"分隔.不支持通配符,需要列出所有jar包,用一点"."代表当前路径. 关于jar是否支持通配符,网上答

JVM【第十二回】:【Java引用】

无论通过引用计数算法判断对象的引用数量,还是通过根搜索算法判断对象的引用链是否可达,判定对象是否存活都与"引用"有关.在JDK1.2之前,Java中的引用的定义很传统:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用.这种定义很纯粹,但是太过狭隘.我们希望能描述这样一类对象:当内存空间还足够时,则能保留在内存之中:如果内存在进行垃圾收集后还是非常紧张,则可以抛弃这些对象.很多系统的的缓存功能都符合这样的引用场景 在JDK1.2之后,