一.强引用
回收时机:在内存不足时也不会被回收。
使用方式:String str = new String("str");
使用场景:是平常用的最多的引用
二.软引用
回收时机: 在内存不足时会被回收。
使用方式:SoftReference<String> wrf = new SoftReference<String>(new String("str"));
使用场景:创建缓存的时候使用,当内存不足时,JVM就会回收早先创建的对象。
三.弱引用
回收时机:gc时会被回收。
使用方式:WeakReference<String> wrf = new WeakReference<String>(str);
使用场景:创建缓存的时候使用
四.虚引用
回收时机:gc时被回收,但是回收前会放入到ReferenceQueue中。其他引用是被JVM回收后才被放入ReferenceQueue中。
使用场景:由于这个机制,虚引用大锁被用于引用销毁前的处理工作。
使用方式: PhantomReference<String> prf = new PhantomReference<String>(new String("str"),
new ReferenceQueue<>());
五.强软弱虚表格概览
六.总结
在实际程序设计中一般很少使用弱引用与虚引用,使用软引用的情况较多,这是因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生。
利用软引用和弱引用解决OOM问题:假如有一个应用需要读取大量的本地图片,如果每次读取图片都从硬盘读取,则会严重影响性能,但是如果全部加载到内存当中,又有可能造成内存溢出,此时使用软引用可以解决这个问题。
设计思路是:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题。