若内存中一个对象没有任何引用的话,则可以认为该对象已经不再使用了,可以成为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基础-处理json函数

    #json是一种通用的数据类型,所有的语言都认识#json是一个字符串,json串里面都得是双引号,主要是这四个函数 #dump#dumps#load#loads import jsonnames = ...

  2. poj-1442 Black Box(Treap)

    题目链接: Black Box 题意: 给一个序列,m个询问,每个询问是求前x个数中的第i小是多少; 思路: Treap的入门题目;Treap能实现STL的set实现不了的功能,如名次树(rank t ...

  3. Python解决中文字符的问题

    from __future__ import unicode_literals print(type("test")) #<type 'unicode'> Chinat ...

  4. java正则表达式匹配文本中想要的字符串

    需求:获取一个本地文件中所有符合 $[MAKE_PACKAGE] 格式的字符串,并输出到另一个文件中. public static void main(String[] args) throws Ex ...

  5. 表达式计算-----------eval()运算符

    1.java的eval()方法(或称之为运算符)可以将字符串解析成可以运行的javaScript代码,例如 eval()只有一个参数.如果传入的参数不是一个字符串,那么它会直接返回这个参数.如果传入的 ...

  6. 洛谷3384&bzoj1036树链剖分

    值得注意的是: 一个点的子树是存在一起的...也就是说我们修改子树的时候只用... /********************************************************* ...

  7. POJ3565 Ants 和 POJ2195 Going Home

    Ants Language:Default Ants Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7975 Accepted: ...

  8. Tensorflow Summary用法

    本文转载自:https://www.cnblogs.com/lyc-seu/p/8647792.html Tensorflow Summary用法 tensorboard 作为一款可视化神器,是学习t ...

  9. NorthSJ项目零碎知识点

    1 div显示纵向滚动条: <div style="overflow-y:auto;overflow-x:hidden;"></div> 2 FineUI的 ...

  10. 12.Redis Select 命令 - 切换到指定的数据库

    转自:http://www.runoob.com/redis/redis-tutorial.html Redis Select 命令用于切换到指定的数据库,数据库索引号 index 用数字值指定,以 ...