1.强引用
这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。
2.软引用(SoftReference)
如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
3.弱引用(WeakReference)
如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
4.虚引用(PhantomReference)
"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃 圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

1 package com.test.reference.mode;

 2 
 3 public class Student {
 4 
 5     private int id;
 6     private String name;
 7     private int age;
 8     
 9     public Student(int id, String name, int age) {
10         super();
11         this.id = id;
12         this.name = name;
13         this.age = age;
14     }
15     
16     @Override
17     protected void finalize() throws Throwable {
18         super.finalize();
19         System.out.println("finalize : " + toString());
20     }
21     
22     @Override
23     public String toString() {
24         return " [Student msg : id = " + id + " name = " + name + " age = " + age +"]";
25     }
26     
27     public int getId() {
28         return id;
29     }
30     public void setId(int id) {
31         this.id = id;
32     }
33     public String getName() {
34         return name;
35     }
36     public void setName(String name) {
37         this.name = name;
38     }
39     public int getAge() {
40         return age;
41     }
42     public void setAge(int age) {
43         this.age = age;
44     }
45     
46 }
 1 package com.test.reference;
 2 
 3 import java.lang.ref.ReferenceQueue;
 4 import java.lang.ref.WeakReference;
 5 
 6 import com.test.reference.mode.Student;
 7 
 8 
 9 
10 public class ReferenceUsage {
11     public static void main(String args[]) {
12         hold();
13         release();
14     }
15 
16     public static void hold() {
17         System.out.println("--------------hold--------------");
18         // Create an object
19         Student stu = new Student(0, "kobe", 33);
20         // Create a reference queue
21         ReferenceQueue<Student> rq = new ReferenceQueue<Student>();
22         // Create a weakReference to obj and associate our reference queue
23         WeakReference<Student> wr = new WeakReference<Student>(stu, rq);
24         System.out.println("weak reference wr: " + wr); // wr
25         System.out.println("weak reference stu wr.get(): " + wr.get()); // stu
26         // Check to see if it´s on the ref queue yet
27         System.out.println("Polling rq.poll(): " + rq.poll()); // null
28         System.gc();
29         System.out.println("hold   gc   ");
30         System.out.println("Polling  rq.poll(): " + rq.poll()); // null
31         System.out.println("weak reference returns obj wr.get(): " + wr.get()); // not null
32     }
33 
34     public static void release() {
35         System.out.println("--------------release--------------");
36         // Create an object
37         Student stu = new Student(0, "刘德华", 48);
38         // Create a reference queue
39         ReferenceQueue<Student> rq = new ReferenceQueue<Student>();
40         // Create a weakReference to obj and associate our reference queue
41         WeakReference<Student> wr = new WeakReference<Student>(stu, rq);
42         System.out.println("weak reference wr: " + wr); // wr
43         System.out.println("weak reference stu wr.get(): " + wr.get()); // stu
44         // Check to see if it´s on the ref queue yet
45         System.out.println("Polling rq.poll(): " + rq.poll()); // null
46         stu = null;
47         System.gc();
48         System.out.println("release   gc   ");
49         System.out.println("Polling  rq.poll() : " + rq.poll()); //maybe not null
50         System.out.println("weak reference returns obj : wr.get() " + wr.get()); // null
51     }

52 }

运行结果:

--------------hold--------------
weak reference wr: java.lang.ref.WeakReference@61de33
weak reference stu wr.get():  [Student msg : id = 0 name = kobe age = 33]
Polling rq.poll(): null
hold   gc   
Polling  rq.poll(): null
weak reference returns obj wr.get():  [Student msg : id = 0 name = kobe age = 33]
--------------release--------------
weak reference wr: java.lang.ref.WeakReference@ca0b6
weak reference stu wr.get():  [Student msg : id = 0 name = 刘德华 age = 48]
Polling rq.poll(): null
finalize :  [Student msg : id = 0 name = 刘德华 age = 48]
finalize :  [Student msg : id = 0 name = kobe age = 33]
release   gc   
Polling  rq.poll() : java.lang.ref.WeakReference@ca0b6
weak reference returns obj : wr.get() null

转载于:https://www.cnblogs.com/cody1988/archive/2012/04/18/2455299.html

java点滴(6)之java引用相关推荐

  1. (一)JAVA 点滴积累之JAVA开发环境安装

    1:下载JDK.  地址www.sun.com  选择windows安装版 2:配置 :我的电脑->属性->高级->环境->path编辑jdk/bin安装所在路径->确定 ...

  2. java字面量和符号引用_java -- JVM的符号引用和直接引用

    在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用. 1.符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可 ...

  3. Java 中的四种引用

    垃圾收集器与内存分配策略参考目录: 1.判断Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9中的GC 调优 5.内存分配与回收策略 在进行垃圾回收之前,虚拟 ...

  4. Java中的四种引用方式的区别

    强引用.软引用.弱引用.虚引用的概念 ps:我更新了.....我真的更新了.....因为博客园不支持MarkDown,而且取了一个很low的用户名,所以不用了..... 强引用(StrongRefer ...

  5. Java若_【JAVA基础】JAVA四种引用(强软若虚)

    java中有四种引用类型,分别是 强引用 强引用也就是我们通常认为的java中的中的引用关系 通过new创建一个对象,然后赋值给一个变量,这个时候这个变量指向堆中地址的引用就是一个强引用 他收到JVM ...

  6. java引用传递106_(转载)java的值传递与引用传递

    1 说明:本文的适用对象为java初学者.如果有读者发现文章中有叙述不妥之处,请指正.2 3 今天在论坛上有人提了一个关于java中调用函数时有没有引用传递的问题,可谓是吵的不可开交.有人说java只 ...

  7. java对象引用出错_“Java有值传递和引用传递”为什么错了?

    前言 初学Java的时候,老师在课堂上说"Java有值传递和引用传递",但网上"Java只有值传递"的呼声很高. 本人在查找资料的过程中,在这两个说法之间反复横 ...

  8. Java正则表达式中的反向引用

    Java正则表达式中的反向引用是Java提供的另一个重要功能. 要了解反向引用 ,我们首先需要了解群组 . 正则表达式中的分组意味着将多个字符视为一个单元. 通过将要分组的字符放在一组括号" ...

  9. 传值类型_Java内存管理:Stackoverflow问答-Java是传值还是传引用(十一)

    勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本文导图: 一.由一个提问引发的思考 在Stack Overflow 看到这样一个问题 ...

最新文章

  1. CVPR2020行人重识别算法论文解读
  2. 4.5.3 BGP协议
  3. pyqt5讲解8:容器QTabWidget,QStackedWidget,QDockWidget
  4. 制作本地 CentOS-7-x86_64-Everything-2009.iso对应的源
  5. 【OS学习笔记】二十二 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之用户程序
  6. golang中文文档_【译】Go 语言源码贡献官方指导文档
  7. 实用Redis操作类
  8. 由如何将EditText失去焦点在首次加载时的思考
  9. linux下磁盘占用达到100%了,找不到哪些大文件耗尽了磁盘。
  10. chrome如何调试html,如何用firefox或chrome浏览器调试js和jquery程序
  11. Zip 命令打包移除多余隐藏文件
  12. idea no artifacts configured 配置
  13. 百度AI市场热品试用 | 台面式双目活 体检测USB摄像头
  14. 如何制作抖音卡点视频,使用预设制作酷炫转场
  15. 以太网PLC无线WIFI跨网段通讯和Modbus仪表数据采集
  16. 量子纠缠的机制是什么?一定要理解整体性概念
  17. R pdf大小_全能格式转换工具分享,PDF 转 Word、视频图片格式转换等
  18. 迪迪机器人_乐乐的好伙伴L.uka绘本阅读机器人
  19. js数组按中文拼音排序_JavaScript数组
  20. 互联网呼唤版权社会化服务

热门文章

  1. JDK1.8源码分析之HashMap(一) (转)
  2. SaltStack组件
  3. type lambda
  4. JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载
  5. Impala与Hive的比较
  6. varnish 防盗链
  7. golang web开发框架 Beego
  8. Docker命令基础 简洁版本
  9. C语言字符型、整型和变量的长度
  10. jdk-12.0.2 64位最新版