• java点滴(6)之java引用


    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


  • 相关阅读:
    教你做一个牛逼的DBA(在大数据下)
    分区扫描执行计划分析简介
    远程桌面无法复制粘贴
    测试链接服务器sql 语句
    webservice 测试窗体只能用于来自本地计算机的请求
    win2003浏览器提示是否需要将当前访问的网站添加到自己信任的站点中去
    如何在excel中把汉字转换成拼音
    关于update set from where
    添加链接服务器的代码
    「android」as过滤svn文件
  • 原文地址:https://www.cnblogs.com/cody1988/p/2455299.html
Copyright © 2020-2023  润新知