栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

引用的不同类型

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

引用的不同类型

    强引用就暂时不解释了 ,我们平时new的对象都是强引用的。软引用:软引用相比与强引用来说稍微要弱一点,一个软引用的对象如果出现了内存不够的情况,那么软引用的对象会被直接回收掉。看下面的例子:
public class softReference {
    public static void main(String[] args) {
    	//创建软引用的对象 里面填充10M的数据
        SoftReference softReference=new SoftReference(new Byte[1024*1024*10]);
        //向jvm提出垃圾回收
        System.gc();
        System.out.println(softReference.get());
        //等待垃圾回收的时间
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //查看是否被回收掉
        System.out.println(softReference.get());
		//新建一个byte数组大小12M
        Byte[] bytes = new Byte[1024*1024 *  12];
        //再查看软引用是否被清除掉
        System.out.println(softReference.get());
    }
}

为了让它的内存被清除掉,我们需要給虚拟机分配内存的时候设置最大堆空间


此处我分配了100M,因为jvm本身也需要占用一定的内存,所以不能太小。

    弱引用:它是一种非常虚幻的引用,每一次垃圾回收,如果对象只存在弱引用,那么直接会被回收掉
public class weakReference {
    public static void main(String[] args) {
        WeakReference weakReference=new WeakReference(new Byte[1024]);
        System.out.println(weakReference.get());
        System.gc();
        System.out.println(weakReference.get());
    }
}

    虚引用,它是一种更加难以追溯的对象 我们的虚引用对象甚至不能够通过虚引用来查看到,它需要配合队列来使用。
    它的作用在于跟踪垃圾回收过程,在对象被收集器回收时收到一个系统通知。 当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在垃圾回收后,将这个虚引用加入引用队列,在其关联的虚引用出队前,不会彻底销毁该对象。 所以可以通过检查引用队列中是否有相应的虚引用来判断对象是否已经被回收了

还有用处就是NIO直接内存引用,在网络编程中服务器接收到数据过后需要复制到我们jvm所管理的内存中,但是这比较耗时,后面就通过一个引用来直接调用,但是它不属于我们的jvm的管理内存中,无法直接删除,所以我们需要用虚引用来指向它,在生命周期的不同时刻做后续的处理。(这个我并不太懂NIO所以只是简单收集了一下网上的)

public class phantoReference {
    private static List list=new linkedList<>();
    private static final ReferenceQueue queue=new ReferenceQueue();

    public static void main(String[] args) {
        PhantomReference phantomReference=new PhantomReference(new Person("张三"),queue);
        System.out.println(phantomReference.get());
        new Thread(()->{
            while(true) {
                list.add(new Byte[1024 * 1024]);
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(phantomReference.get());
            }
        }).start();

        new Thread(()->{
            while(true) {
                Reference poll = queue.poll();
                if(poll!=null){
                    System.out.println("虚引用对象被jvm回收了"+poll);
                }
            }
        }).start();
    }
    static class Person{
        private String name;
        public Person(String name){
            this.name=name;
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/778483.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号