java中的引用类型:强软弱虚
java中的引用类型共4种:强软弱虚,具体每种类型的特点和应用场景。记录下。本文是看了马士兵老师的视频后记录整理的。加深印象。
基本概念
1. 强引用
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。

显式地设置M对象为null,或让其超出对象的生命周期范围,则gc认为该对象不存在引用,这时就可以回收这个对象
示例代码
声明一个M类
public class M {
    /**
     * 当这个对象会被回收的时候,finalize会被调用
     *
     * @throws Throwable
     */
    @Override
    protected void finalize() throws Throwable {
        System.out.println("finalize");
    }
}
强引用调用
public class NormalReference {
    public static void main(String[] args) throws IOException {
        M m = new M();
        m = null;
        System.gc();
        // 如果不写 main方法退出。System.gc()在垃圾回收线程里;
        // 有可能还没来得及回收main方法就退出了
        System.in.read();
    }
}
输出结果
finalize
2. 软引用
软引用对象是在jvm内存不够的时候才会被回收

代码示例
public class Soft {
    public static void main(String[] args) {
        System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024);
        //10m
        SoftReference<byte[]> m = new SoftReference<>(new byte[1024 * 1024 * 10]);
        System.out.println(m.get());
        System.gc();
        try {
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(m.get());
        // 再分配一个数组,heap装不下去,这时候系统会垃圾回收,
        // 先回收一次,如果不够,会把软引用回收
        byte[] b = new byte[1024 * 1024 * 11];
        System.out.println(m.get());
    }
}
设置程序运行参数:-Xmx20M 
运行结果
19
[B@1540e19d
[B@1540e19d
null
我们可以看到,这个时候已经被回收了。
应用场景:软引用时候做缓存
3. 弱引用
弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存
代码示例
public class Weak {
    public static void main(String[] args) {
        WeakReference<M> m = new WeakReference<>(new M());
        System.out.println(m.get());
        System.gc();
        System.out.println(m.get());
    }
}
执行结果
M@1540e19d
null
finalize
4. 虚引用
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

示例
public class Phantom {
    private static final List<Object> LIST = new LinkedList<>();
    private static final ReferenceQueue<M> QUEUE = new ReferenceQueue<>();
    public static void main(String[] args) {
        PhantomReference<M> phantomReference = new PhantomReference<>(new M(), QUEUE);
        new Thread(
                () -> {
                    while (true) {
                        LIST.add(new byte[1024 * 1024]);
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }
                        System.out.println(phantomReference.get());
                    }
                }
        ).start();
        new Thread(() -> {
            while (true) {
                Reference<? extends M> poll = QUEUE.poll();
                if (poll != null) {
                    System.out.println("-------虚引用对象被jvm回收了------" + poll);
                }
            }
        }).start();
    }
}
运行结果
finalize
null
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
	at Phantom.lambda$main$0(Phantom.java:18)
	at Phantom$$Lambda$1/1078694789.run(Unknown Source)
	at java.lang.Thread.run(Thread.java:748)
-------虚引用对象被jvm回收了------java.lang.ref.PhantomReference@688ee48d
应用场景:堆外内存的管理
总结

java中的引用类型:强软弱虚的更多相关文章
- JAVA不可不知的强软弱虚四种引用
		一个变量指向new对象,就是引用,在java中有四种引用,分别是强软弱虚,常见的Object o = new Object(),就是强引用,垃圾回收的时候,强引用不会被回收. 公用类: publi ... 
- 5.9 j(java学习笔记)强软弱虚引用及WeakHashMap、IdentityHashMap、EnumMap
		一.引用分类 强:运行垃圾回收机制后也不回收,程序出现内存溢出也不回收. 软:在垃圾回收机制运行时判断内存是否已满,如果内存已满则回收,内存充足则不回收. 弱:垃圾回收机制运行后不论内存是否充足都会立 ... 
- Java中的引用类型(强引用、弱引用)和垃圾回收
		Java中的引用类型和垃圾回收 强引用Strong References 强引用是最常见的引用: 比如: StringBuffer buffer = new StringBuffer(); 创建了一个 ... 
- Java中的引用类型和使用场景
		作者:Grey 原文地址:Java中的引用类型和使用场景 Java中的引用类型有哪几种? Java中的引用类型分成强引用, 软引用, 弱引用, 虚引用. 强引用 没有引用指向这个对象,垃圾回收会回收 ... 
- ThreadLocal以及强软弱虚引用
		1.ThreadLocal ThreadLocal即线程本地,可以实现每个线程存入取出TreadLocal值互不影响.因为TheadLocal底层是用了一个Map结构存放数据,而这个Map是从当前这个 ... 
- java强软弱虚引用详解(转载)
		转载自:http://zhangjunhd.blog.51cto.com/113473/53092/ ava:对象的强.软.弱和虚引用 2007-12-01 17:20:20 标签:Java 软引用 ... 
- java 中的引用类型
		GC基本原理 GC (Garbage Collection)的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征 ... 
- java的4种引用 强软弱虚
		&lt;img src="https://pic4.zhimg.com/d643d9ab5c933ac475cfa23063bed137_b.png" data-r ... 
- java的四种引用:强软弱虚
		简介 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于(reachable)可达状态,程序才能使用它. 从JDK 1.2版本开始,对象的引 ... 
随机推荐
- mysql设置文档快捷写
			select distinct column_name,column_comment,column_type from information_schema.columns where table_n ... 
- poj2699 转化为可行性判定问题+二分枚举+最大流
			The Maximum Number of Strong Kings Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2302 ... 
- 一文读懂Java注解
			什么是注解 Java官方文档上说,注解是元数据的一种形式,它提供不属于程序一部分的数据,注解对被注解的代码没有直接的影响. 准确上说,注解只不过是一种特殊的注释而已,如果没有解析它的代码,它可能连注释 ... 
- 消息队列RabbitMQ的安装配置与PHP中的使用
			一.RabbitMQ安装 windows安装 下载地址: https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/ra ... 
- Python的自定义属性访问跟描述器以及ORM模型的简单介绍
			一 . 自定义属性访问 1.__getattr__ 作用:当我们访问属性的时候,如果属性不存在(出现AttrError),该方法会被触发. 2.__getattribute__ 作用:访问属性的时候, ... 
- web自动化之键盘操作
			简单介绍下web自动化怎么触发键盘操作 按键操作 需要导入的类from selenium.webdriver.common.keys import Keys 组合键Keys.CONTROL 也就是我们 ... 
- 微软Azure IoT驱动数字化变革线上分享会(6月4号)
			微软Azure IoT驱动数字化变革线上分享会(6月4号) 微软作为全球范围内IoT领域的领军者,以微软智能云Azure为基础和核心,推动包括物联网.机器学习.微服务.人工智能等在内的新技术的发展 ... 
- 小谢第10问:前端JS下载文件、表格
			对于小型文件及表格下载,一般采用a标签形式 <buttonb @click="downloadTemplate()">模板下载</button> downl ... 
- Linux (三)  基础命令 上
			个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一 . 背景知识 1. Linux系统中一切皆文件 在Linux系统中任何东西都是以文件形式来存储的.这 ... 
- Entity FrameWork操作数据库完成登陆、列表显示+验证码
			登陆页面 登陆页面的页面结构比较简单,没有写样式. image标签的作用是用来显示验证码. 一般处理程序代码展示 using System; using System.Collections.Gene ... 
