对象的引用以及区别

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会把虚引用的对象放到引用队列里面。可用来在对象被回收时做额外的一些资源清理或事物回滚等处理。

你可能感兴趣的:(对象的引用以及区别)