Android 强引用,弱引用,软引用,虚引用
来源:互联网 发布:js回调函数的返回值 编辑:程序博客网 时间:2024/06/05 14:21
在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引用了。
从Java SE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。下面来阐述一下这四种类型引用的概念:
基本概念
1.强引用(Strong reference)
强引用我们最常用的一种引用类型。当我们使用new关键字去新建一个对象的时候,创建的就是强引用。
当一个对象具有强引用,那么垃圾回收器是绝对不会的回收和销毁它的。
当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。
2.弱引用(WeakReference )
弱引用通过类WeakReference来表示。
在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
3.软引用(SoftReference)
我们可以把软引用理解成一种稍强的弱引用。使用类SoftReference来表示。
很多人可能会把弱引用和软引用搞混,注意他们的区别在于:如果一个对象只具有软引用,若内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,才会回收这些对象的内存。
而只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
所以从引用的强度来讲:
强引用 > 软引用 > 弱引用。
表面上看来,软引用非常适合于创建缓存。当系统内存不足的时候,缓存中的内容是可以被释放的。
但是,在实践中,使用软引用作为缓存时效率是比较低的,系统并不知道哪些软引用指向的对象应该被回收,哪些应该被保留。过早被回收的对象会导致不必要的工作,比如Bitmap要重新从SdCard或者网络上加载到内存。
所以使用软引用去缓存对象,虽然确实可以避免OOM问题,却不适用于某些场景。在Android开发中,一种更好的选择是使用LruCache,LRU是Least Recently Used的缩写,即“最近最少使用”,它的内部会维护一个固定大小的内存,当内存不足的时候,会根据策略把最近最少使用的数据移除,让出内存给最新的数据。
4.虚引用(PhantomReference)
一般不使用,略过。
- android强引用 软引用 弱引用 虚引用
- Android 强引用,弱引用,软引用,虚引用
- Android 强引用、软引用、弱引用、虚引用
- android 强引用、弱引用、软引用、虚引用
- Android 强引用,弱引用,软引用,虚引用
- Android 强引用,弱引用,软引用,虚引用
- Android 强引用,弱引用,软引用,虚引用
- Android 强引用、软引用、弱引用、虚引用
- Android中的强引用、软引用、弱引用、虚引用
- Android 强引用,弱引用,软引用,虚引用讲解
- Android 强引用,弱引用,软引用,虚引用
- android中四大引用的区别,强引用、软引用、弱引用和虚引用
- Android中的引用类型(强引用,弱引用,软引用,虚引用)
- Java 强引用、 软引用、 弱引用、虚引用
- Java 强引用、 软引用、 弱引用、虚引用
- 转:强引用、软引用、弱引用和虚引用
- Java 强引用、 软引用、 弱引用、虚引用
- Java 强引用、 软引用、 弱引用、虚引用
- 网易笔试编程题(一)
- 每日一题--丑数
- 非Spring Boot Web项目 注册节点到Eureka Server并提供服务
- 适配器设计模式
- JS输出日期封装
- Android 强引用,弱引用,软引用,虚引用
- Java多线程--并发集合框架概述
- Hbase伪分布式安装
- 技术文章 | 安卓开发笔记——探索EventBus
- setTimeout、setInterval。其第三个参数和this的讨论,超时嵌套和内存泄漏
- 关于okhttp的二次封装
- python 发送邮件(3) 多人 带附件
- VC2008出现warningC4996的解决方法
- Swift 中的关键字 final和super