中国商标买卖网站,wordpress opcache,杨凌做网站的,怎么查网站的icp备案个人总结如下#xff1a;
4种类型的引用 由高到低依次为#xff1a;强引用软引用弱引用虚引用
(1)、强引用
如#xff1a;Object objectnew Object#xff08;#xff09;#xff0c;object就是一个强引用了。
当内存空间不足#xff0c;Java虚拟机宁愿…
个人总结如下
4种类型的引用 由高到低依次为强引用软引用弱引用虚引用
(1)、强引用
如Object objectnew Objectobject就是一个强引用了。
当内存空间不足Java虚拟机宁愿抛出OutOfMemoryError错误使程序异常终止也不会被回收。
(2)、软引用 只有内存不足(OOM)时软引用才被回收常用于缓存
(3)、弱引用 弱引用的对象拥有更短暂的生命周期。只要执行GC都会回收它的内存。
(4)、虚引用 如果一个对象仅持有虚引用那么它就和没有任何引用一样在任何时候都可能被垃圾回收。
什么时候使用软引用什么时候使用弱引用
(1)、软引用如果只是想避免OOM异常 例如网页缓存、Bitmap图片图片缓存.
(2)、弱引用如果更在意应用的性能想尽快回收一些占用内存比较大的对象。 对系统的性能有较高要求的时候需要使用弱引用。 下面 是摘自网上的一篇博客 想必很多朋友对OOMOutOfMemory这个错误不会陌生而当遇到这种错误如何有效地解决这个问题呢今天我们就来说一下如何利用软引用和弱引用来有效地解决程序中出现的OOM问题. 一.了解 强引用、软引用、弱引用、虚引用的概念 在Java中虽然不需要程序员手动去管理对象的生命周期但是如果希望某些对象具备一定的生命周期的话比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误就需要用到软引用和弱引用了。 从Java SE2开始就提供了四种类型的引用强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的第一是可以让程序员通过代码的方式决定某些对象的生命周期第二是有利于JVM进行垃圾回收。下面来阐述一下这四种类型引用的概念 1.强引用StrongReference 强引用就是指在程序代码之中普遍存在的比如下面这段代码中的object和str都是强引用 ? 1 2 Object object new Object(); String str hello; 只要某个对象有强引用与之关联JVM必定不会回收这个对象即使在内存不足的情况下JVM宁愿抛出OutOfMemory错误也不会回收这种对象。比如下面这段代码 ? 1 2 3 4 5 6 7 8 9 public class Main { public static void main(String[] args) { new Main().fun1(); } public void fun1() { Object object new Object(); Object[] objArr new Object[1000]; } } 当运行至Object[] objArr new Object[1000];这句时如果内存不足JVM会抛出OOM错误也不会回收object指向的对象。不过要注意的是当fun1运行完之后object和objArr都已经不存在了所以它们指向的对象都会被JVM回收。 如果想中断强引用和某个对象之间的关联可以显示地将引用赋值为null这样一来的话JVM在合适的时间就会回收该对象。 比如Vector类的clear方法中就是通过将引用赋值为null来实现清理工作的 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 /** * Removes the element at the specified position in this Vector. * Shifts any subsequent elements to the left (subtracts one from their * indices). Returns the element that was removed from the Vector. * * throws ArrayIndexOutOfBoundsException if the index is out of range * ({code index 0 || index size()}) * param index the index of the element to be removed * return element that was removed * since 1.2 */ public synchronized E remove(int index) { modCount; if (index elementCount) throw new ArrayIndexOutOfBoundsException(index); Object oldValue elementData[index]; int numMoved elementCount - index - 1; if (numMoved 0) System.arraycopy(elementData, index1, elementData, index, numMoved); elementData[--elementCount] null; // Let gc do its work return (E)oldValue; } 2.软引用SoftReference 软引用是用来描述一些有用但并不是必需的对象在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象只有在内存不足的时候JVM才会回收该对象。因此这一点可以很好地用来解决OOM的问题并且这个特性很适合用来实现缓存比如网页缓存、图片缓存等。 软引用可以和一个引用队列ReferenceQueue联合使用如果软引用所引用的对象被JVM回收这个软引用就会被加入到与之关联的引用队列中。下面是一个使用示例 ? 1 2 3 4 5 6 7 import java.lang.ref.SoftReference; public class Main { public static void main(String[] args) { SoftReferenceString sr new SoftReferenceString(new String(hello)); System.out.println(sr.get()); } } 3.弱引用WeakReference 弱引用也是用来描述非必需对象的当JVM进行垃圾回收时无论内存是否充足都会回收被弱引用关联的对象。在java中用java.lang.ref.WeakReference类来表示。下面是使用示例 ? 1 2 3 4 5 6 7 8 9 import java.lang.ref.WeakReference; public class Main { public static void main(String[] args) { WeakReferenceString sr new WeakReferenceString(new String(hello)); System.out.println(sr.get()); System.gc(); //通知JVM的gc进行垃圾回收 System.out.println(sr.get()); } } 输出结果为 hello null 第二个输出结果是null这说明只要JVM进行垃圾回收被弱引用关联的对象必定会被回收掉。不过要注意的是这里所说的被弱引用关联的对象是指只有弱引用与之关联如果存在强引用同时与之关联则进行垃圾回收时也不会回收该对象软引用也是如此。 弱引用可以和一个引用队列ReferenceQueue联合使用如果弱引用所引用的对象被JVM回收这个软引用就会被加入到与之关联的引用队列中。 4.虚引用PhantomReference 虚引用和前面的软引用、弱引用不同它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联则跟没有引用与之关联一样在任何时候都可能被垃圾回收器回收。 要注意的是虚引用必须和引用队列关联使用当垃圾回收器准备回收一个对象时如果发现它还有虚引用就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列那么就可以在所引用的对象的内存被回收之前采取必要的行动。 ? 1 2 3 4 5 6 7 8 9 import java.lang.ref.PhantomReference; import java.lang.ref.ReferenceQueue; public class Main { public static void main(String[] args) { ReferenceQueueString queue new ReferenceQueueString(); PhantomReferenceString pr new PhantomReferenceString(new String(hello), queue); System.out.println(pr.get()); } } 二.进一步理解软引用和弱引用 对于强引用我们平时在编写代码时经常会用到。而对于其他三种类型的引用使用得最多的就是软引用和弱引用这2种既有相似之处又有区别。它们都是用来描述非必需对象的但是被软引用关联的对象只有在内存不足时才会被回收而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。 在SoftReference类中有三个方法两个构造方法和一个get方法WekReference类似 两个构造方法 ? 1 2 3 4 5 6 7 8 public SoftReference(T referent) { super(referent); this.timestamp clock; } public SoftReference(T referent, ReferenceQueue? super T q) { super(referent, q); this.timestamp clock; } get方法用来获取与软引用关联的对象的引用如果该对象被回收了则返回null。 在使用软引用和弱引用的时候我们可以显示地通过System.gc()来通知JVM进行垃圾回收但是要注意的是虽然发出了通知JVM不一定会立刻执行也就是说这句是无法确保此时JVM一定会进行垃圾回收的。 三.如何利用软引用和弱引用解决OOM问题 前面讲了关于软引用和弱引用相关的基础知识那么到底如何利用它们来优化程序性能从而避免OOM的问题呢 下面举个例子假如有一个应用需要读取大量的本地图片如果每次读取图片都从硬盘读取则会严重影响性能但是如果全部加载到内存当中又有可能造成内存溢出此时使用软引用可以解决这个问题。 设计思路是用一个HashMap来保存图片的路径 和 相应图片对象关联的软引用之间的映射关系在内存不足时JVM会自动回收这些缓存图片对象所占用的空间从而有效地避免了OOM的问题。在Android开发中对于大量图片下载会经常用到。 下面这段代码是摘自博客 http://blog.csdn.net/arui319/article/details/8489451 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 private MapString, SoftReferenceBitmap imageCache new HashMapString, SoftReferenceBitmap(); br.... public void addBitmapToCache(String path) { // 强引用的Bitmap对象 Bitmap bitmap BitmapFactory.decodeFile(path); // 软引用的Bitmap对象 SoftReferenceBitmap softBitmap new SoftReferenceBitmap(bitmap); // 添加该对象到Map中使其缓存 imageCache.put(path, softBitmap); } public Bitmap getBitmapByPath(String path) { // 从缓存中取软引用的Bitmap对象 SoftReferenceBitmap softBitmap imageCache.get(path); // 判断是否存在软引用 if (softBitmap null) { return null; } // 取出Bitmap对象如果由于内存不足Bitmap被回收将取得空 Bitmap bitmap softBitmap.get(); return bitmap; } 当然这里我们把缓存替换策略交给了JVM去执行这是一种比较简单的处理方法。