强引用,弱引用,软引用,虚引用基本概念

前提

  1. Java是一门高级编程语言,它的优点很多,最重要的应该就是可以通过不同平台的JVM(Java虚拟机)实现跨平台操作(一次编译,到处运行)。
  2. 所以学习Java的开发人员避免不了去和JVM接触并了解,JVM主要负责内存分配及回收,所以使用JVM非常方便,但因此不够灵活。

JDK1.2版本开始,便把对象的引用分为四种级别,使程序能更灵活控制对象的生命周期。级别从高到低依次为:强引用,软引用,弱引用,虚引用

这些一大堆的引用就是程序 对 控制 对象的生命周期 更加灵活!

强引用

  • 强引用在Java基础学习和日常出现的非常多,比如Student stu = new Student(…); 就是个强引用。
    这里stu称之为句柄,new Student(…) 创建的对象才是真正有用的东西,比如一把拖把 ,stu就是那个棍子,是用来使用new Student(…)这个拖布的。再比如 String str = “” 也是一个强引用,强引用占据我们的极大部分开发过程。
  • 一个对象具有强引用时,GC(垃圾回收机制) 是不敢也不能去回收被强引用的对象的。内存空间不足时,JVM抛出outofmemoryerror错误,程序终止,也不会回收强引用的对象。

软引用

软引用就和内存空间有关了,内存空间充足,GC就不会回收,反之,就会回收,这种引用经常用来实现内存敏感的高速缓存。

//软引用对象
        SoftReference<Course> cacheCourse1 = new SoftReference<>(new Course(4,"sad",200,5));
        //这就是一个软引用
        List list = new ArrayList();//创建一个list用来占内存操作
        for (int i = 0; i < 1000; i++) {
        list.add(new byte[1024*1024*5]);//设置大小
            System.gc();//调用GC
            Thread.sleep(200);
            if(cacheCourse1.get()==null){ //如果软引用=null
            System.out.println("内存不够,gc把软引用干掉了");
            break;
        }else{
                System.out.println(cacheCourse1.get());
            }
    }

弱引用

弱引用的对象在一次GC时就会被回收,与内存空间无关,生命周期很短暂。用的最多的就是WeakReference。
如下图,定义一个强引用,定义一个WeakReference,但是()里是强引用的句柄,那GC回收时会不会把这个弱引用回收呢,答案是不会,因为这里它抱了强引用的大腿。course1是强引用,GC是不会回收的,所以运行后cacheCourse1是存在的,但是cacheCourse2就为null了,被GC回收了。

  //强引用
        Course course1 = new Course(4,"sad",200,5);
        //复制一份弱引用
        WeakReference<Course> cacheCourse1 = new WeakReference<Course>(course1);
        WeakReference<Course> cacheCourse2 = new WeakReference<Course>(new Course(4,"sad",200,5));
        System.gc();
        System.out.println(course1);
        System.out.println(cacheCourse1.get());
        System.out.println(cacheCourse2.get());

虚引用

虚引用和其他三种不同,它的级别最低,不会决定对象的生命周期。虚引用主要用于跟踪对象被垃圾回收的活动,不知道什么时候被垃圾回收。虚引用必须和引用队列联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来知道被引用的对象是否将要被垃圾回收

在实际程序设计中一般很少使用弱引用与虚引用,使用软引用的情况较多,这是因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值