博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java强弱引用示例
阅读量:6157 次
发布时间:2019-06-21

本文共 5851 字,大约阅读时间需要 19 分钟。

hot3.png

package jdk;import java.lang.ref.PhantomReference;import java.lang.ref.ReferenceQueue;import java.lang.ref.SoftReference;import java.lang.ref.WeakReference;public class SoftWeakPhantomReferenceTest {        private static Man man = null;    public static void main(String[] args) throws Exception {        //testStringWeakReference();        //System.out.println("************************");        //testRealObjWeakReference();        //testRealObjSoftReference();        //testRealObjPhantomReference();        testRealObjPhantomReferenceWithThisEscape();    }    public static void testStringWeakReference() throws Exception {        String name = new String("why");        ReferenceQueue
nameQueue = new ReferenceQueue<>();        WeakReference
weakReference = new WeakReference
(name, nameQueue);        System.out.println("weakReference.isEnqueued-1:" + weakReference.isEnqueued());        name = null;        System.out.println("name此时是可恢复状态:" + weakReference.get());        System.gc();        Thread.sleep(3000);        System.out.println("name此时已经被回收了:" + weakReference.get());        System.out.println("weakReference.isEnqueued-2:" + weakReference.isEnqueued());        System.out.println("nameQueue = " + nameQueue.poll().get());    }        public static void testRealObjSoftReference() throws Exception {        byte[] byteArr = new byte[1024 * 1024 * 5];        System.out.println(byteArr.length);        ReferenceQueue
byteArrQueue = new ReferenceQueue
();        SoftReference
softReference = new SoftReference
(byteArr, byteArrQueue);        System.out.println("weakReference.isEnqueued-1:" + softReference.isEnqueued());        byteArr = null;        System.out.println("byteArr此时是可恢复状态:" + softReference.get().length);        new Thread(() -> {            try {                System.out.println("weakReference.isEnqueued-2:" + softReference.isEnqueued());                byteArrQueue.remove();                System.out.println("垃圾收集已执行");            } catch (InterruptedException e) {                e.printStackTrace();            }        }).start();                byte[] byteArr2 = new byte[1024 * 1024 * 5];        System.out.println(byteArr2.length);        System.gc();        Thread.sleep(3000);        System.out.println("byteArr此时已经被回收了:" + softReference.get());        System.out.println("weakReference.isEnqueued-3:" + softReference.isEnqueued());        System.out.println("nameQueue = " + (byteArrQueue.poll() == null ? "null" : byteArrQueue.poll().get()));    }    public static void testRealObjWeakReference() throws Exception {        Person person = new Person("why");        ReferenceQueue
personQueue = new ReferenceQueue
();        WeakReference
weakReference = new WeakReference
(person, personQueue);        person = null;        System.out.println("name此时是可恢复状态:" + weakReference.get());        new Thread(() -> {            try {                personQueue.remove();                System.out.println("垃圾收集已执行");            } catch (InterruptedException e) {                e.printStackTrace();            }        }).start();        System.gc();        Thread.sleep(1000);        System.out.println("personQueue.getClass() = " + personQueue.getClass().getName());        System.out.println("name此时已经被回收了:" + weakReference.get());        System.out.println("weakReference.isEnqueued:" + weakReference.isEnqueued());        System.out.println("nameQueue = " + (personQueue.poll() == null ? "null" : personQueue.poll().get()));    }        public static void testRealObjPhantomReference() throws Exception {        Person person = new Person("why");        ReferenceQueue
personQueue = new ReferenceQueue
();        PhantomReference
phantomReference = new PhantomReference
(person, personQueue);        System.out.println("weakReference.isEnqueued-1:" + phantomReference.isEnqueued());        person = null;        System.out.println("name此时是可恢复状态:" + phantomReference.get());        new Thread(() -> {            try {                System.out.println("weakReference.isEnqueued-2:" + phantomReference.isEnqueued());                personQueue.remove();                System.out.println("垃圾收集已执行");            } catch (InterruptedException e) {                e.printStackTrace();            }        }).start();        System.gc();        Thread.sleep(2000);        System.out.println("name此时已经被回收了:" + phantomReference.get());        System.out.println("phantomReference.isEnqueued-3:" + phantomReference.isEnqueued());        System.out.println("nameQueue = " + (personQueue.poll() == null ? "null" : personQueue.poll().get()));    }        public static void testRealObjPhantomReferenceWithThisEscape() throws Exception {        Man person = new Man("why");        ReferenceQueue
personQueue = new ReferenceQueue
();        PhantomReference
phantomReference = new PhantomReference
(person, personQueue);        System.out.println("weakReference.isEnqueued-1:" + phantomReference.isEnqueued());        person = null;        System.out.println("name此时是可恢复状态:" + phantomReference.get());        new Thread(() -> {            try {                System.out.println("weakReference.isEnqueued-2:" + phantomReference.isEnqueued());                personQueue.remove();                System.out.println("垃圾收集已执行");            } catch (InterruptedException e) {                e.printStackTrace();            }        }).start();        System.gc();        Thread.sleep(2000);        System.out.println("name此时已经被回收了:" + phantomReference.get());        System.out.println("phantomReference.isEnqueued-3:" + phantomReference.isEnqueued());        System.out.println("nameQueue = " + (personQueue.poll() == null ? "null" : personQueue.poll().get()));                if (man != null) {            System.out.println("man's name is " + man.getName());        }    }    static class Person {        String name;        public Person(String name) {            super();            this.name = name;        }        public String getName() {            return name;        }        public void setName(String name) {            this.name = name;        }        @Override        public String toString() {            return "Person [name=" + name + "]";        }    }        static class Man {        String name;        public Man(String name) {            super();            this.name = name;        }        public String getName() {            return name;        }        public void setName(String name) {            this.name = name;        }        @Override        protected void finalize() throws Throwable {            SoftWeakPhantomReferenceTest.man = this;            System.out.println("this instance escapsed.");        }        @Override        public String toString() {            return "Person [name=" + name + "]";        }    }}

 

转载于:https://my.oschina.net/mojiewhy/blog/1833214

你可能感兴趣的文章
利用FIFO进行文件拷贝一例
查看>>
Ecshop安装过程中的的问题:cls_image::gd_version()和不支持JPEG
查看>>
resmgr:cpu quantum等待事件
查看>>
一个屌丝程序猿的人生(六十六)
查看>>
Java 编码 UTF-8
查看>>
SpringMVC实战(注解)
查看>>
关于静态属性和静态函数
查看>>
进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
查看>>
spring+jotm+ibatis+mysql实现JTA分布式事务
查看>>
MyBatis启动:MapperStatement创建
查看>>
调查问卷相关
查看>>
eclipse启动无响应,老是加载不了revert resources,或停留在Loading workbench状态
查看>>
1. Git-2.12.0-64-bit .exe下载
查看>>
怎样关闭“粘滞键”?
查看>>
[转]React 教程
查看>>
拓扑排序介绍
查看>>
eclipse打开工作空间(workspace)没有任务反应
查看>>
使用Sybmol模块来构建神经网络
查看>>
字符串去分割符号
查看>>
WPF中,多key值绑定问题,一个key绑定一个界面上的对象
查看>>