java中四种引用强、软、弱、虚介绍,以及用到的场景
今天学习了java中四种引用:强、软、弱、虚引用,并介绍它们用到的场景
Q:介绍一下java中四种引用强、软、弱、虚介绍,以及用到的场景?
A:在jdk1.2之前版本中,若一个对象不能被任何变量引用,那么程序就无法使用这个对象,也就是说只有对象处于可触及状态下,程序才可以访问它,在jdk1.2之后,引入了四种引用类型,4种级别从高到第的顺序为:强引用、软引用、弱引用以及虚引用。
1. 强引用:所谓强引用就是像这种 Object obj=new Object(); 创建对象的方式就是强引用,对于任何对象来说只要还有强引用指向它,那么即使内存不够用,抛出OutOfMemoryError使程序异常终止,也不会回收该对象来解决内存不足的问题。强引用有以下几个特征:1.强引用可以直接操作对象。2.强引用所指向的对象在任何时候都不会被系统回收。3.强引用可能导致内存泄漏。至于强引用的使用场景就是我们常见的new对象进行操作。
2.软引用:软引用(SoftReference)在强度上弱于强引用,通过SoftReference来实现。可以让对象避免一些垃圾收集,只有在内存不足时,才会试图回收软引用指向的对象。JVM会在进行OOM之前进行对软引用的回收,软引用可以和引用队列(ReferenceQueue)联合使用。当软引用被GC回收之后,该引用就会被加入到引用队列中,可以通过引用队列的poll操作来检查你所关心的对象是否被GC回收。软引用有以下几点特征:1.软引用可以使用get()方法取得对象的强引用来访问对象。2.软引用所指向的对象按照内存的使用情况来绝对是否进行回收。3.软引用可以避免内存不足时所导致的异常。软引用的使用场景:比如用来实现内存敏感的缓存,如果有空闲空间就可以保留缓存,当内存不足时则可以清理缓存。这样就保证在使用缓存的同时不会耗尽内存。例如在你浏览一个网页时一个后退键,它是否会重新构建网页呢。有两种解决方法:1.将网页信息存储在内存中,这种方法会很耗费内存并且会有可能造成OOM。2.将网页信息重新构建,这种方式效率会很低,每次后退都要重建网页。 这时就可以使用软引用,读取一个网页将它赋给一个软引用,当内存充足时,每次后退直接访问该软引用对象即可得到该网页;当内存不足时,则可以清除掉它,来避免OOM
3.弱引用:弱引用(WeakReference)在强度上弱于软引用。通过WeakReference来实现。它的作用是引用一个对象,但并不印象GC对该对象的回收。如果使用一个强引用的话,只要该引用存在,被引用的对象是不会被回收的。但是弱引用并没有这个问题。在垃圾收集器进行回收时,如果一个对象上的所有引用都是弱引用,则该对象会被GC回收掉,弱引用也可以和引用队列(ReferenceQueue)联用,如果一个弱引用对象被回收掉,则该引用会被加入引用队列中,也可以通过引用队列的poll()操作来检查你所关心的对象是否被GC回收掉。弱引用有以下几个特点:1.可以使用弱引用的get方法来获取该对象的强引用来对象该对象进行操作。2.一旦该对象要被GC回收,无论内存是否够用该对象都会被GC回收掉。弱引用使用场景:当你想引用一个对象的时候,但是这个对象它有自己的生命周期,而你不想介入这个对象的生命周期,这时候就可以使用弱引用,这个引用不会在该对象被GC时的判断中产生任何附加性印象。用一个形象的例子来描述弱引用,就好比如‘城管’和‘小贩’,‘城管’就好比如GC,‘小贩‘就好比如弱引用,当城管遇到小贩,小贩肯定会被驱逐。
4.虚引用:虚引用(PhantomReference)在强度上弱于软引用,通过PhantomReference来实现,顾名思义虚引用就是‘形同虚设’,与其他引用不同虚引用并不会对对象产生任何的印象,甚至它不能通过get来获取对象的引用。如果一个对象仅持有虚引用,那么它就和没用任何引用一样,在任何时候都可能被垃圾收集器回收掉。至于虚引用的使用场景:虚引用必须和引用队列联用,虚引用虽然不能提供它所引用对象的任何东西,但是它不同于上面几种引用的地方是:上面几种引用只有在被GC回收掉之后才会被加入到引用队列,而虚引用却不同,当它所引用的对象调用了finalize方法时,就会被加入到引用队列中,何为finalize方法,该方法在对象被第一次GC时被调用,并且只会被调用一次。但是调用之后并不是立即就会被回收掉的,只是加入到了GC的回收队列中等待GC最终回收。因此程序可以通过判断引用队列中是否加入了虚引用,来了解被引用对象是否要被垃圾回收掉。如果程序发现某个虚引用已经被加入到引用队列中了,那么就可以在所引用的对象被回收之前采取一些程序行动。总而言之,可以用来跟踪对象被垃圾回收的过程,当一个虚引用关联的对象被GC回收之前,会收到一个通知。