若内存中一个对象没有任何引用的话,则可以认为该对象已经不再使用了,可以成为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. Python基础-列表推导式

    python中列表推导式有三种数据类型可用:列表,字典,集合 列表推导式书写形式: [表达式 for 变量 in 列表]    或者  [表达式 for 变量 in 列表 if 条件] 1,列表推导式 ...

  2. C++STL(vector,map,set,list,bitset,deque)成员函数整理

    补充: vector 删除指定元素: vec.erase(remove(vec.begin(), vec.end(), val),           vec.end());remove()返回的是删 ...

  3. codeforces 652D D. Nested Segments(离散化+sort+树状数组)

    题目链接: D. Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  4. poj 1845 Sumdiv(约数和,乘法逆元)

    题目: 求AB的正约数之和. 输入: A,B(0<=A,B<=5*107) 输出: 一个整数,AB的正约数之和 mod 9901. 思路: 根据正整数唯一分解定理,若一个正整数表示为:A= ...

  5. XP系统下显示文件或文件的安全选项卡

    在很多的时候,我们需要设置文件或文件夹的权限,这里一般就要用到安全选项卡,但在xp系统下,默认是不显示的,如何调出我们的“安全”选项卡呢? 具体做法:点击“工具”菜单下的"文件夹选项(o). ...

  6. 如何恢复,迁移,添加, 删除 Voting Disks

    如何恢复,迁移,添加, 删除 Voting Disks恢复流程 在11gR2 之前,我们可以直接直接使用dd命令对voting disk进行备份.DD示例 备份votedisk盘:[root@raw1 ...

  7. bzoj 3994 约数个数和 —— 反演+数论分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3994 推导过程和这里一样:https://www.cnblogs.com/MashiroSk ...

  8. Ubuntu14.04如何用root账号登陆系统

    在虚拟机VMWARE中安装完Ubuntu后,只能用新建的普通用户登陆,很不方便做实验:那如何用root用户登陆账号呢? (1)用普通账号登陆,打开终端terminal: (2)在terminal的输入 ...

  9. sql查询将列里面的值替换为别的值但是实际值不变

    数据库有一张表BUG(缺陷记录表) 里面有字段severity(严重程度): severity的值实际为1,2,3,4,但希望在查询结果中将severity的1,2,3,4值显示为其他的值,但seve ...

  10. VC 绘图,使用双缓冲技术实现

    VC 绘图,使用双缓冲技术实现 - Cloud-Datacenter-Renewable Energy-Big Data-Model - 博客频道 - CSDN.NET VC 绘图,使用双缓冲技术实现 ...