美文网首页
对象的引用以及区别

对象的引用以及区别

作者: 第一号伤心人 | 来源:发表于2018-03-15 12:15 被阅读3次

Java 内存回收不需要程序员负责,JVM会在必要时启动Java GC完成垃圾回收。为了方便控制对象的生命周期,提供了四种引用方式,包括:强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)、虚引用(PhantomReference),引用强度由强到弱。通过提供这四种引用类型的主要目的:1、通过代码的方式决定某些对象的声明周期  2、有利于JVM进行垃圾回收。

1、StrongReference:是Java的默认引用形式,不需要显示定义,任何通过强引用所使用的对象不管系统资源多紧张,JavaGC 都不会主动回收具有强引用的对象。

        如Object obj = new Object(); String str = "hello,world!"; 创建一个对象并且把这个对象赋值给一个引用变量。

         强引用有引用变量指向时永远不会被垃圾回收,JVM抛出OutOfMemoryError也不会回收这种对象。如果要中断强引用与对象的持有关联,可以显示的赋值为null,这样JVM在合适的时机就会回收。

2、SoftReference:如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收;如果内存空间不足,就会回收这些对象的内存;只要垃圾回收器没有回收它,该对象就可以被程序使用。

        软引用可用来实现内存敏感的高速缓存,比如:网页缓存、图片缓存等。使用软引用能防止内存泄露,增强程序的健壮性。SoftReference的特点是它的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。另外,一旦垃圾线程回收该Java对象之 后,get()方法将返回null。

3、WeakReference:弱引用是用来描述非必需对象,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。

4、PhantomReference:从PhantomReference类的源代码可以知道,它的get()方法无论何时返回的都只会是null。所以单独使用虚引用时,没有什么意义,需要和引用队列ReferenceQueue类联合使用。当执行Java GC时如果一个对象只有虚引用,就会把这个对象加入到与之关联的ReferenceQueue中。

综上:强引用是 Java 的默认引用形式,使用时不需要显示定义,是我们平时最常使用到的引用方式。不管系统资源有多紧张,Java GC都不会主动回收具有强引用的对象。弱引用和软引用一般在引用对象为非必需对象的时候使用。它们的区别是被弱引用关联的对象在垃圾回收时总是会被回收,被软引用关联的对象只有在内存不足时才会被回收。虚引用的get()方法获取的永远是null,无法获取对象实例。Java GC会把虚引用的对象放到引用队列里面。可用来在对象被回收时做额外的一些资源清理或事物回滚等处理。

相关文章

  • 对象的引用以及区别

    Java 内存回收不需要程序员负责,JVM会在必要时启动Java GC完成垃圾回收。为了方便控制对象的生命周期,提...

  • C#基础之 Struct和Class的区别

    基本的区别:Struct的对象传值,Class的对象传引用。 特殊区别:MetadataTypeAttribute...

  • js 对象深拷贝&浅拷贝

    对象深拷贝和浅拷贝的区别: 浅拷贝: 赋值对象的引用,而不是对象的本身;深拷贝: 把复制的对象所引用的全部对象都复...

  • C/C++ basis 01

    1. C和C++区别 2. 指针和引用 sizeof(引用)等于 引用指向对象的大小。 对比值传递,引用传递(引用...

  • 深拷贝与浅拷贝

    1.copy 与 retain 的区别 copy: 创建一个新的对象,新的对象引用计数加1,被copy对象的引用计...

  • 复制引用和复制对象的区别

    复制引用和复制对象的区别 复制引用:是指将某个对象的地址复制,所以复制后的对象副本的地址和源对象相同,这样,当改变...

  • JDK1.8之方法引用(方法别名/函数式接口声明/Spring分

    1.四种方法引用 这里区别于对象引用:对象引用是不同的对象可以操作同一块内容而方法引用就是指为一个方法设置别名,相...

  • iOS常见面试题

    1、浅复制和深复制的区别 浅层复制:只复制指向对象的指针,而不复制引用对象本身。 深层复制:复制引用对象本身。 意...

  • objective深浅拷贝

    浅复制和深复制的区别? 浅复制:只复制指向对象的指针,而不复制引用对象本身。 深复制:复制引用对象本身。 意思就是...

  • 《Web前端开发之JavaScript精英课堂》(三)

    条件语句补充,初始引用值 初识引用 数组 对象 编程形式的区别 面向过程 面向对象 typeof 返回字符串类型的...

网友评论

      本文标题:对象的引用以及区别

      本文链接:https://www.haomeiwen.com/subject/lmyzfftx.html