Android 强引用,弱引用,软引用,虚引用
来源:互联网 发布:伊本白图泰 知乎 编辑:程序博客网 时间:2024/06/07 01:48
转载请注明出处:http://blog.csdn.NET/mr_liabill/article/details/48344483 来自《LiaBin的博客》
基本概念
1. 强引用
以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。
2.软引用(SoftReference)
如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
3.弱引用(WeakReference)
如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。
4. 虚引用
用的比较少,就不管它了
例子
class Reference { private StringBuilder stringBuilder; public Reference() { stringBuilder = new StringBuilder("test"); } public StringBuilder getString() { return stringBuilder; } }
强引用举例
Reference ref = new Reference(); Reference secondRef=ref; ref=null;
此时Reference对象还有secodeRef强引用指向,所以即使发生GC也不会回收释放
弱引用举例
public static void main(String[] args) { System.out.println("开始"); Reference ref = new Reference(); WeakReference<Reference> weakRef = new WeakReference<Reference>(ref); //引用置为null,只是把引用设置为null,指向的对象是否被回收需要看情况,如果没有任何强引用指向, //那么当发生GC的时候,无论如何该对象都会被回收。(如果有软引用指向该对象,视情况是否回收) ref = null; System.gc();// 强制对系统进行GC,因为GC是不固定的,这个需要JVM调度,如果没发生GC,那么虚引用所指向的对象还是不会被回收,直到程序运行结束。 // 此时该对象没有强引用指向它,只有虚引用指向这个对象,所以可以直接回收这个对象 // 如果此时是软引用指向这个对象,然后发生GC,视情况决定是否回收这个对象,内存不足,回收,否则不回收 // SoftReference<A> weakA = new SoftReference<A>(a); //<span style="color:#33CC00;">即使调用System.gc();JVM也不一定会发生回收,不同JVM有不同的实现,这里恰好发生了GC,所以产生了如下打印结果</span>。 Reference anoRef = weakRef.get(); if (anoRef == null) { //说明上面new的Reference已经JVM的GC回收 System.out.println("anoRef is null"); } else { //对象没有被回收 System.out.println(anoRef.getString().toString()); } System.out.println("结束"); }
发生了GC,对象只有一个弱引用指向,所以回收释放Reference对象
输出:
开始
anoRef is null
结束
软引用举例
WeakReference<Reference> weakRef = new WeakReference<Reference>(ref);
替换为
SoftReference<A> weakA = new SoftReference<A>(a);
此时对象只有一个软引用指向,因为此时内存还很足够,所以不回收Reference对象
输出:
开始
test
结束
- android强引用 软引用 弱引用 虚引用
- Android 强引用,弱引用,软引用,虚引用
- Android 强引用、软引用、弱引用、虚引用
- android 强引用、弱引用、软引用、虚引用
- Android 强引用,弱引用,软引用,虚引用
- Android 强引用,弱引用,软引用,虚引用
- Android 强引用,弱引用,软引用,虚引用
- Android 强引用、软引用、弱引用、虚引用
- Android中的强引用、软引用、弱引用、虚引用
- Android 强引用,弱引用,软引用,虚引用讲解
- Android 强引用,弱引用,软引用,虚引用
- android中四大引用的区别,强引用、软引用、弱引用和虚引用
- Android中的引用类型(强引用,弱引用,软引用,虚引用)
- Java 强引用、 软引用、 弱引用、虚引用
- Java 强引用、 软引用、 弱引用、虚引用
- 转:强引用、软引用、弱引用和虚引用
- Java 强引用、 软引用、 弱引用、虚引用
- Java 强引用、 软引用、 弱引用、虚引用
- 4.接口隔离原则
- windows下面安装Python和pip终极教程
- ajax+servlet+jsp 小例子
- 平衡二叉树
- 正则表达式校验一个数字字符串是否为升序
- Android 强引用,弱引用,软引用,虚引用
- Leetcode 284. Peeking Iterator
- Android 中的线程池
- Java基础之equal()与hashcode()函数分析
- WCF-Binding
- 2017.4.17解题报告f
- ssm挖坑,遇到的问题
- 10天训练营----古诗
- 自动化测试流程图