Android中深度学习对象的四种引用类型(强引用、软引用、弱引用、幻引用)在JDK1.2中将对象引用分为四个层次,使程序可以更灵活地控制其生命周期。级别从高到低的顺序是:强>软>弱>幻影参考;而GC垃圾收集器(GarbageCollection)对于不同的类型有不同的处理方式,理解这些方式可以帮助我们写出更高质量的代码。今天我们将学习:1.参考详解1.强参考StrongReference是最常用的参考。如果一个对象有强引用,垃圾收集器将永远不会收集它。当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError错误导致程序异常终止,也不会通过任意回收强引用对象来解决内存不足的问题。例如,代码Strings=”abc”中的变量s是对字符串对象“abc”的强引用。只要给强引用对象s赋一个null值,该对象就可以被垃圾回收器回收;因为此时对象不再包含其他强引用;//str代表强引用,指向newString()对象Stringstr=newString();2.弱引用弱引用(WeakReference)是一种比软引用弱的引用类型。它类似于软引用,不同的是弱引用不能防止垃圾回收。如果被引用,不管内存空间是否足够,对象都会被回收。弱引用常用于防止内存泄漏,最常见的是单例和Handler引起的内存泄漏;//弱引用实例WeakReferenceweakReference=newWeakReference<>(context);//获取弱引用保存的引用Contextctx=weakReference.get();3。SoftreferenceSoftReference:软引用-->当虚拟机内存不足时,它指向的对象会被回收;当需要获取对象时,可以调用get方法;软引用对象不会很快被jvm回收,jvm会根据当前堆的使用情况来判断何时回收,当堆的使用频率接近阈值时才会回收;基本用法MySoftReferencemsf=newMySoftReference();SoftReferencesf=newSoftReference(msf);MySoftReferencemySoftReference=(MySoftReference)sf.get();基本特点如果内存足够,软引用不会被jvm回收;如果内存不够,则根据栈的使用情况回收引用;未回收的软引用可以一直被程序占用;软引用可以与引用队列(ReferenceQueue)结合使用,实现内存紧缓存;如果软引用引用的对象被回收,Java虚拟机会将修改后的软引用对象添加到与其关联的引用队列中;ReferenceQueuerq=newReferenceQueue();SoftReferencesf=newSoftReference(msf,rf);当软引用对象被回收时,ReferenceQueue队列中存放的是强引用的Reference,然后可以通过poll()判断当前引用队列中是否有丢失软引用的对象。如果队列为空,将返回一个null,否则该方法返回一个位于队列前面的Reference对象。可以检测回收了哪个软引用对象,然后清除它;Referencereference=null;while((reference==(EmployeeRef)rq.poll())){//清除操作reference=null;System.gc();}4。幻象引用幻象引用(PhantomReference)是最弱的引用。持有虚引用的对象几乎和没有引用一样,随时可能被垃圾回收器回收。虚引用的get()方法获取的引用会失败(null)。虚引用必须和引用队列ReferenceQueue一起使用;ReferenceQueue引用队列的作用是跟踪垃圾回收过程。垃圾回收器在回收一个对象时,如果发现它还有虚引用,就会在回收后销毁该对象,并将虚引用指向的对象添加到引用队列中。只能通过虚引用是否加入ReferenceQueue来判断虚引用是否被GC回收,这也是判断对象是否被回收的唯一方法;Java的Object类有一个finalize()方法,其原理是:一旦垃圾回收器准备释放对象所占用的内存空间,就会先调用finalize()方法,直到对象占用的内存才会真正回收nextgarbagecollectionactionoccurs,但问题是虚拟机无法保证什么时候调用finalize(),因为GC运行的时间不固定;这个问题可以通过使用幻象引用来解决。幻引用主要用于跟踪垃圾回收活动,实现更精细的内存使用控制,这对Android来说意义重大;//引用队列ReferenceQueuequeue=newReferenceQueue<>();//PhantomReferencephantomReference=newPhantomReference(newObject(),queue);Log.e(TAG,"Virtualreference:PhantomReference="+phantomReference.get());//系统垃圾回收System.gc();System.runFinalization();phantomReference.get()得到的引用一直为null,调用系统回收垃圾,queue.poll()获取保存的引用对象,并从这个队列中移除;幻引用无法通过get()方法得到目标的引用,一直返回null,源码:publicTget(){returnnull;}总结强引用(StrongReference):不会自动回收,最难被回收被GC回收,抛出Exception最好不要回收强引用指向的对象;任何场景;软引用(SoftReference):当内存不足时,GC会回收软引用指向的对象,目前比较少用,已经被LruCache取代;弱引用(WeakReference):不管内存是否不足,只要GC能回收弱??引用指向的对象;它通常用于避免内存泄漏;幻影引用(PhantomReference):可以随时回收,也称为幽灵引用,相当于没有指向任何实例引用;跟踪对象是否被回收是很容易的。本文转载自微信公众号《Android开发编程》
