若内存中一个对象没有任何引用的话,则可以认为该对象已经不再使用了,可以成为GC的候选。不过由于垃圾回收器的运行时间不确定,可被垃圾回收的对象的实际被回收时间是不确定的。对于一个对象来说,只要有引用的存在,它就会一直存在于内存中。如果这样的对象越来越多,超出了JVM中的内存总数,JVM就会抛出OutOfMemory错误。虽然垃圾回收的具体运行是由JVM来控制的,但是开发人员仍然可以在一定程度上与垃圾回收器进行交互,其目的在于更好的帮助垃圾回收器管理好应用的内存。这种交互方式就是使用JDK 1.2引入的java.lang.ref包。从JDK1.2开始,JDK引入了四种级别的引用,分别为:强引用,软引用,弱引用和虚引用。

一、强引用(Strong Reference)

在一般的java程序中用的最多的就是强引用,如Person p = new Person() ,p就是一个对象的强引用。若一个对象具有强引用,那么它在垃圾回收过程中是不会被回收的,当JVM内存不足时,会抛出OutOfMemory异常也不会去回收强应用对象。强引用限制了对象在内存中的存活时间,如若对象A中存在对象B的强引用,那么B的存活时间一定是不小于A的。若对象A没有显示的将B的引用置为null的话,那么只有对象A被回收之后不含有对对象B的引用,对象B才能被回收。

二、软引用(SoftReference)

软引用的在强度上低于强引用,用SoftReference表示。在进行垃圾回收时,若当前内存不足时,只具有软引用的对象将被回收,若仅具有软引用的对象被回收后内存仍不足,此时才会抛出OutOfMemory异常;若内存足够时,就不会回收它。软引用可以和ReferenceQueue 引用队列一起使用,若软引用所引用的对象被垃圾回收后,那么就将该对象的软引用加入到引用队列中。软引用非常适合用于创建缓存的应用。对于需要多次读取数据库的例子来说:                                       ReferenceQueue  q = new ReferenceQueue();

//获取数据并且缓存Object  obj  = Dao.get();

              SoftReference ref = new SoftReference(q,obj);

              //当在进行数据库的查询时,直接从缓存中获取

              Object o = ref.get();

if(o == null)

o = Dao.get();

//当仅存在的软引用的对象被垃圾回收之后,清理引用队列中的软引用对象SoftReference

              SoftReference  sf = null;

while((sf=q.poll())!=null){

                清理软引用对象。

              }

 三、弱引用(WeakReference)

弱引用在强度上弱于虚引用,只具有软引用的对象相比于软引用具有更短的生命周期。当JVM进行垃圾回收时,扫描到只具有弱引用对象时就会将其进行垃圾回收。弱引用存在的作用在于解决强引用所带来的对象之间在存活时间上的耦合关系,在强引用中对象A中存在着对象B的强引用,除非A对象将对B的引用置为null才能对对象B进行回收;否则,B对象的回收必须在A对象被回收之后。引入弱引用之后,能够解决对象之间生存时间的耦合问题。弱引用的典型应用集合类中,有其哈希表中。哈希表本身就具有对这些键和值对象的引用,若这种引用为强引用的话,若哈希表一直使用那么哈希表将变的越来越大。最终,可能会导致JVM的内存溢出。使用弱引用就不会有这样的问题。JDK中提供了WeakHashMap来满足这一需求。

四、虚引用(Phantom Reference)

又称幽灵引用,又称为幽灵引用或幻影引用,,虚引用既不会影响对象的生命周期,也无法通过虚引用来获取对象实例,仅用于在发生GC时接收一个系统通知。

Object类中的方法finalize()方法被用来在对对象被回收之前做一些清理工作,但Java中的垃圾回收运行的时间是不确定的,因此finalize方法执行的时间也是不确定的。虚引用可以用来解决这个问题,虚引用(Phantom Reference)的使用必须伴随着引用队列。当一个对象的finalize方法被调用了之后,那么将该对象的虚引用加入到引用队列中,可以通过检查引用队列就能够知道对象是否应该被回收了。

参考文献:http://www.infoq.com/cn/articles/cf-java-garbage-references

Java 引用类型的更多相关文章

  1. 深入理解Java引用类型

    深入理解Java引用类型 在Java中类型可分为两大类:值类型与引用类型.值类型就是基本数据类型(如int ,double 等),而引用类型,是指除了基本的变量类型之外的所有类型(如通过 class ...

  2. Java引用类型之软引用(2)

    下面接着上一篇介绍第2阶段和第3阶段的处理逻辑. 2.process_phase2() 第2个阶段移除所有的referent还存活的Reference,也就是从refs_list中移除Referenc ...

  3. Java引用类型之弱引用与幻像引用

    这一篇将介绍弱引用和幻像引用. 1.WeakReference WeakReference也就是弱引用,弱引用和软引用类似,它是用来描述"非必须"的对象的,它的强度比软引用要更弱一 ...

  4. Java引用类型之最终引用

    FinalReference类只有一个子类Finalizer,并且Finalizer由关键字final修饰,所以无法继承扩展.类的定义如下: class FinalReference<T> ...

  5. WeakHashMap和Java引用类型详细解析

    WeakHashMap是种弱引用的HashMap,这是说,WeakHashMap里的key值如果没有外部强引用,在垃圾回收之后,WeakHashMap的对应内容也会被移除掉. 1.1 Java的引用类 ...

  6. 你不可不知的Java引用类型之——虚引用

    定义 虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个.一个对象是否有虚引用的存在,完全不会对其生命周期构成影响,也无法通过虚引用获 ...

  7. 你不可不知的Java引用类型之——弱引用

    定义 弱引用是使用WeakReference创建的引用,弱引用也是用来描述非必需对象的,它是比软引用更弱的引用类型.在发生GC时,只要发现弱引用,不管系统堆空间是否足够,都会将对象进行回收. 说明 弱 ...

  8. java引用类型简述

    主要内容: 1.引用类型简述 2.对象的可达性 3.软引用的垃圾回收分析 4.WeakHashMap分析 5.ThreadLocal内存泄漏分析 1.引用类型简述 在Java语言中除了基本数据类型外, ...

  9. Java引用类型作为形参和返回值

    一.什么是引用类型 在Java中引用类型包括三种:类.抽象类.接口. 二.引用类型作为形参使用 1.类作为形参 /** * 类作为形参,实际传递的是该类的对象 */ class Student { p ...

  10. 一段代码看 Java 引用类型

    Java 中的操作数(不知道叫什么,相对于 bytecode 而言,类似 CPU 的操作码和操作数)分为值类型和引用类型: 值类型就是直接存储最终数值的,如 char, int, float, dou ...

随机推荐

  1. Linux_笔记_01_设置静态IP与 SecureCRT连接Linux

    步骤一至三,即可设置好静态IP 步骤四至九,使SecureCRT连接Linux 步骤一:编辑ifcfg-eth0 文件 1.打开ifcfg-eth0 文件 使用命令:vi /etc/sysconfig ...

  2. Java进阶07 嵌套类

    到现在为止,我们都是在Java文件中直接定义类.这样的类出现在包(package)的级别上.Java允许类的嵌套定义. 这里将讲解如何在一个类中嵌套定义另一个类. 嵌套 内部类 Java允许我们在类的 ...

  3. YNOI2016 这是我自己的发明

    看到这个标题立刻想到:. “绝地科学家,八倍不屏息啊,八百里外把头打啊...” 首先我们发现如果只考虑第二个操作,这棵树就是假的,我们可以直接莫队解决 如果考虑换根的话...可以把一个操作换成小于等于 ...

  4. 使用Anthem.NET 1.5中的FileUpload控件实现Ajax方式的文件上传

    Anthem.NET刚刚发布了其最新的1.5版本,其中很不错的一个新功能就是对文件上传功能的Ajax实现.本文将简要介绍一下该功能的使用方法. Anthem.NET的下载与安装 Anthem.NET可 ...

  5. cloudera上面安装Spark2.0

    Cloudera默认值是提供Spark1.6的安装,下面介绍如何来安装spark2.1 1. csd包:http://archive.cloudera.com/spark2/csd/ 2. parce ...

  6. python中http请求中添加cookie支持

    python3中构造http的Request需要用到urllib.request. 有时会用到cookie. 比如在访问网站首页得到cookie,通过下面代码添加cookie:      #insta ...

  7. hdu 5616 Jam's balance 正反背包+转换

    http://acm.hdu.edu.cn/showproblem.php?pid=5616 思路 题目中蕴含着两种需要计算的重量 1. 从所有的砝码中挑出任意种2.(转换的思想)在天平的两端都挑出这 ...

  8. java基础知识(9)---异常

    异 常: 异常:就是不正常.程序在运行时出现的不正常情况.其实就是程序中出现的问题.这个问题按照面向对象思想进行描述,并封装成了对象.因为问题的产生有产生的原因.有问题的名称.有问题的描述等多个属性信 ...

  9. 请定义一个宏,比较两个数的a、b的大小,不能使用大于、小于、if语句

    请定义一个宏,比较两个数的a.b的大小,不能使用大于.小于.if语句 方法一:    #define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b): ...

  10. Java解析XML:Jdom解析和SAX解析

    今天看了Java解析XML的几种方法,记录一下 1.Jdom解析 (1)读取XML内容 private static void readXML() { // TODO Auto-generated m ...