Java中的四种引用方式的区别 强引用、软引用、弱引用、虚引用的概念[通俗易懂]

Java中的四种引用方式的区别 强引用、软引用、弱引用、虚引用的概念[通俗易懂]Java中的四种引用方式的区别 强引用、软引用、弱引用、虚引用的概念

大家好,又见面了,我是你们的朋友全栈君。

强引用(StrongReference)

强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用:

1

2

Object object = new Object();

String str = "hello";

只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。比如下面这段代码:

1

2

3

4

5

6

7

8

9

10

public class Main {

    public static void main(String[] args) {

        new Main().fun1();

    }

      

    public void fun1() {

        Object object = new Object();

        Object[] objArr = new Object[1000];

    }

}

当运行至Object[] objArr = new Object[1000];这句时,如果内存不足,JVM会抛出OOM错误也不会回收object指向的对象。不过要注意的是,当fun1运行完之后,object和objArr都已经不存在了,所以它们指向的对象都会被JVM回收。

如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。

软引用(SoftReference)

软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。

软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。下面是一个使用示例:

1

2

3

4

5

6

7

8

9

10

11

12

import java.lang.ref.WeakReference;

  

public class Main {

    public static void main(String[] args) {

      

        SoftReference<String> sr = new SoftReference<String>(new String("hello"));

          

        System.out.println(sr.get());

        System.gc();                //通知JVM的gc进行垃圾回收

        System.out.println(sr.get());

    }

}

弱引用(WeakReference)

弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。下面是使用示例:

1

2

3

4

5

6

7

8

9

10

11

12

import java.lang.ref.WeakReference;

  

public class Main {

    public static void main(String[] args) {

      

        WeakReference<String> sr = new WeakReference<String>(new String("hello"));

          

        System.out.println(sr.get());

        System.gc();                //通知JVM的gc进行垃圾回收

        System.out.println(sr.get());

    }

}

虚引用(PhantomReference)

虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

进一步理解软引用和弱引用

对于强引用,我们平时在编写代码时经常会用到。而对于其他三种类型的引用,使用得最多的就是软引用和弱引用,这2种既有相似之处又有区别。它们都是用来描述非必需对象的,但是被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。针对上面的特性,软引用适合用来进行缓存,当内存不够时能让JVM回收内存,弱引用能用来在回调函数中防止内存泄露。因为回调函数往往是匿名内部类,隐式保存有对外部类的引用,所以如果回调函数是在另一个线程里面被回调,而这时如果需要回收外部类,那么就会内存泄露,因为匿名内部类保存有对外部类的强引用。

 

转自:https://www.cnblogs.com/alias-blog/p/5793108.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106048.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • clgao资源网址

    clgao资源网址工作流项目github:https://github.com/snakerflow/snaker-web

    2022年6月24日
    25
  • 利用serv-u搭建ftp服务器实验报告_服务器系统怎么进U启动

    利用serv-u搭建ftp服务器实验报告_服务器系统怎么进U启动以前在学校的时候,学校的整个宿舍楼都是在一个局域网中,经常有人用个人电脑搭个网站或者FTP啊什么的,主要是进行一些影视资源的传播活动。不乏有些资源充沛的有志青年利用业余时间翻译某岛国影视资源,利用局域网FTP上传到某大大的个人电脑上。资源广为分享,其翻译作品之影响力在我们热血青年心中丝毫不亚于书记的训话。我们记住了大大的服务器帐号,也记住了大大被通报批评后黯然的神情,却忽视了在背后默…

    2022年9月4日
    3
  • android之Activity.startManagingCursor方法详解

    在使用数据库操作查询数据后,如果是在Activity里面处理,那么很可能就会用到startManagingCursor()方法,在这里讲一下它的作用和使用注意事项.调用这个方法,就是将获得的Cursor对象交与Activity 来管理,这样Cursor对象的生命周期便能与当前的Activity自动同步,省去了自己管理Cursor。看下文档里的注释This method allows

    2022年3月10日
    39
  • Okio原理分析之简介

    Okio原理分析之简介Okio是一个实现java.io和java.nio的库,更方便访问、存储和处理数据。作为OkHttp组件的一部分,在Android中引入支持HTTP的客户端Okio一些关键概念介绍先看一下类图,对整体框架有个大概的了解ByteString和Buffer保存数据ByteString代表一个不可变的字节序列。对于char数据,String是基础类型。Buffer可变的字节序列,像ArrayList,读写Buffer的操作与queue类似,从尾部写,从头部读,不需要管理position/limi

    2022年5月12日
    47
  • Linux安装redis和部署

    Linux安装redis和部署Linux安装redis和部署第一步:下载安装包访问https://redis.io/download到官网进行下载。这里下载最新的6.2.6版本.第二步:安装1.通过远程管理工具,将压缩包拷贝到Linux服务器中,执行解压操作tar-zxfredis-4.0.9.tar.gz2.进入解压文件目录使用make对解压的Redis文件进行编译图示:这里因为我redis的安装目录在/usr/locat/目录下,因此会有如下操作注:如果在编译过程中出现问题,有可能是安

    2022年9月28日
    0
  • ubuntu进tty1_linux最小系统板

    ubuntu进tty1_linux最小系统板这个系统很迷你。完全符合变态操作控的习惯,如果你很喜欢洁净的系统,那么它就是你的玩具~可以试试自己的能力,是否能够在这系统里DIY一个属于你自己的LINUX。。。转载于:https://www.cnblogs.com/xiaoCon/archive/2013/03/31/2991221.html…

    2025年5月22日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号