0. 引言

  Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference ,
这 4 种类型的引用与 GC 有着密切的关系.

1. 强引用 (StrongReference)

  普通的引用做法,如:
String str = "hello";
只要引用存在就不会被回收,除非手动置为null,或者超出范围,gc才会回收

2. 软引用 (SoftReference)

  当JVM虚拟机内存不足时,会回收软引用对象.这样做的好处是,保证java抛出OutOfMemory异常前,把弱引用对象置为null,
用于一些资源的缓存,实现Cache功能.如:
A obj = new A();
SoftReference sr = new SoftReference(obj);

//引用时
if(sr!=null){
  obj = sr.get();
}else{
  obj = new A();
  sr = new SoftReference(obj);
}
  垃圾收集器在运行时可能会(也可能不会)释放软可及对象.对象是否被释放取决
于垃圾收集器的算法以及垃圾收集器运行时可用的内存数量.

3. 弱引用 (WeakReference)

  和软引用 大同小异, SoftReference和WeakReference的区别是:一旦gc发现对象是WeakReference可达就会把它放到ReferenceQueue中,然后等下次gc时回收它;当对象是SoftReference可达时,gc可能会向操作系统申请更多内存,而不是直接回收它,当实在没辙了才回收它。像cache系统,最适合用SoftReference。让gc来替我们决定什么时候回收对象以及回收哪些对象。

4. 虚引用 (PhantomRefrence)

  用得较少,建立虚引用之后通过get方法返回结果始终为null,对ReferenceQueue软引用和弱引用可以有可无,但是虚引用必须有
虚引用的唯一用处是跟踪 referent 何时被 enqueue 到 ReferenceQueue 中

5. 比较

  四种引用的强弱关系按上面顺序排下来:强 > 软 > 弱 > 虚.对于对象是属于哪种可及的对象,由他的最强的引用决定

6. 小结

  一般的应用程序不会涉及到 Reference 编程, 但是了解这些知识会对理解 GC 的工作原理以及性能调优有一定帮助, 在实现一些基础性设施比如缓存时也可能会用到

java 引用类型及作用的更多相关文章

  1. java 接口的作用和好处

    1.java 接口的作用 http://blog.csdn.net/hack_bug/article/details/7634737 2.一位Java大牛的回答 很多JAVA初级程序员对于接口存在的意 ...

  2. Java 动态代理作用是什么?

    Java 动态代理作用是什么?   1 条评论 分享   默认排序按时间排序 19 个回答 133赞同反对,不会显示你的姓名 Intopass 程序员,近期沉迷于动漫ING 133 人赞同 ① 首先你 ...

  3. Java关键字及其作用

    Java关键字及其作用 一. 关键字总览 访问控制 private protected public             类,方法和变量修饰符 abstract class extends fin ...

  4. Java 过滤器的作用

    Servlet API 非常久曾经就已成为企业应用开发的基石,而 Servlet 过滤器则是对 J2EE 家族的相对较新的补充.在 J2EE 探索者 系列文章的最后一篇中,作者 Kyle Gabhar ...

  5. 【Java学习笔记之一】java关键字及作用

    Java关键字及其作用 一. 总览: 访问控制 private protected public 类,方法和变量修饰符 abstract class extends final implements ...

  6. JAVA关键字及作用

    ---恢复内容开始--- Java关键字及其作用 一. 总览: 访问控制 private protected public 类,方法和变量修饰符 abstract class extends fina ...

  7. java内部类的作用

    java内部类的作用 定义: 放在一个类的内部的类我们就叫内部类. 二. 作用: 1.内部类可以很好的实现隐藏 一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2 ...

  8. java transient关键字作用,使用场景。

    java transient关键字作用,使用场景. 2016年08月31日 15:31:10 阅读数:4280 transient的作用及使用方法,官方解释为: Variables may be ma ...

  9. 深入理解Java引用类型

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

随机推荐

  1. C# DateDiff与DateAdd

    原文地址:http://www.wlm.so/Article/Detail/lmb49q5hxpqyi00000 刚刚在百度上搜C#里面的DateDiff,一看吓一跳,C#没有这个函数. 还有各种自定 ...

  2. I.MX6 driver goto 使用

    /************************************************************************** * I.MX6 driver goto 使用 * ...

  3. PHPUNIT 单元测试

    在windows上的安装可以参考其手册 首先下载phpunit.phar文件 1. 为php的二进制可执行文件建立 一个目录,如C:\bin 2. 将C:\bin添加到系统环境变量中, 3. 打开命令 ...

  4. dataguard 日志传输服务

    1.日志传输可以分为 lgwr和ARCH,默认是arch,其中lgwr传输可以分为async和syncsync:同步服务,只有在事物参数的日志成功的传输到备库的目的地,事物才能提交.虽然同步服务没有限 ...

  5. jquery放大镜

    效果体验:http://runjs.cn/detail/dvygyp5t demo下载 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tra ...

  6. POJ 1258 Agri-Net

    题意:给一个无向图的邻接矩阵,求最小生成树. 解法:Kruskal算法.把边按边权排序,从小到大插入生成树中,如果一个边的两个点都在生成树中则不插入,用并查集维护. 代码: #include<s ...

  7. mina2

      远程通信 Mina2 学习笔记 作者:李少华 邮箱:xiaosanshaoli@126.com QQ:305409913 2010-12-23   初稿 引言... 1 一.       Mina ...

  8. HDU1540 Tunnel Warfare 水题

    分析:不需要线段树,set可过,STL大法好 #include <iostream> #include <cstdio> #include <cstring> #i ...

  9. [LeetCode]切割字符串,使各个子串都是回文

    题目:Given a string s, partition s such that every substring of the partition is a palindrome. Return ...

  10. wuzhicms 自定义SQL 标签

    {wz:sql sql="select * from wz_guestbook"} {loop $rs $r} {$r[title]} {/loop} {/wz} 自定义统计条数: ...