没有合适的资源?快使用搜索试试~ 我知道了~
Android避免内存溢出(Out of Memory)方法汇总
1 下载量 64 浏览量
2021-01-20
09:52:45
上传
评论
收藏 90KB PDF 举报
温馨提示


试读
3页
避免内存溢出的方法,主要是对以下三个方面对程序进行优化 内存引用 在处理内存引用之前,我们先来复习下什么是强引用、软引用、弱引用、虚引用 强引用:强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 软引用:如果一个对象只具有软引用,但内存空间足够时,垃圾回收器就不会回收它;直到虚拟机报告内存不够时才会回收, 只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。 软引用可以和一个引用队列
资源详情
资源评论
资源推荐

Android避免内存溢出(避免内存溢出(Out of Memory)方法汇总)方法汇总
避免内存溢出的方法,主要是对以下三个方面对程序进行优化
内存引用内存引用
在处理内存引用之前,我们先来复习下什么是强引用、软引用、弱引用、虚引用
强引用:强引用:强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。 当内存空间不足,Java虚拟
机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
软引用:软引用:如果一个对象只具有软引用,但内存空间足够时,垃圾回收器就不会回收它;直到虚拟机报告内存不够时才会回收,
只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。 软引用可以和一个引用队
列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关
联的引用队列中。
弱引用:弱引用:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具
有弱引用的对象,不管当前内存空间是否足够,都会回收它的内存。 不过,由于垃圾回收器是一个优先级很低的线程,因此
不一定会很快发现那些只具有弱引用的对象。 弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用
的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
虚引用:虚引用:虚引用可以理解为虚设的引用,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚
引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。 虚引用主要用来跟踪对象被垃圾回收器回收的
活动。 虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。 当垃圾回收器准
备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。 程
序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。 如果程序发现某个虚引用已
经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
1、释放强引用、释放强引用
一般我们在声明对象变量时,使用完后就不管了,认为垃圾回收器会帮助我们回收这些对象所指向的内存空间,实际上如果这
个对象的内存空间还处在被引用状态的话,垃圾回收器是永远不会回收它的内存空间的,只有当这个内存空间不被任何对象引
用的时候,垃圾回收器才会去回收。
所以我们在使用完对象后,可以把对象置为空,这样我的垃圾回收器gc就会在合适的时候释放掉为该对象分配的内存空间
Object obj = new Object();
obj = null;
当然,在置为空前要确认是否不再需要使用该对象了,如果需要随时使用这个对象,则不能这么做
2、使用软引用、使用软引用
在jvm报告内存不足之前会清除所有的软引用,这样的话gc就可以收集到很多软引用释放出来的内存空间,从而解决内存吃紧
的问题,避免内存溢出,什么时候被回收取决于gc的算法和gc运行时可用的内存大小。
我们可以用SoftReference来封装强引用的对象
String str = "zhuwentao"; // 强引用
SoftReference<String> strSoft = new SoftReference<String>(str);
// 使用软引用封装强引用
3、使用弱引用、使用弱引用
gc收集弱引用对象的执行过程和软引用一样,只是gc不会根据内存情况来决定是否回收弱引用的对象。
String str = "zhuwentao"; // 强引用
WeakReference<String> strWeak = new WeakReference<String>(str);
// 使用弱引用封装强强引用
如果你希望能够随时取得某个对象的信息,但又不希望影响该对象的垃圾回收,则应该使用WeakReference来记住该对象,
而不是使用一般的Reference。
图像处理图像处理
大部分的OOM都是发生在图片加载上的,当我们加载大图时,需要特别注意避免OOM的发生。
处理大图片时,不管你的手机内存有多大,如果不对图片进行处理,都有可能会发生内存溢出问题。
因为Android系统会为每一个应用分配一定大小的内存,并不会把整个系统内存全部分给应用,所以不管你手机内存多大,对
每个App来说,它能使用的内存都是有限的。
这和PC端是有很大的不同,PC端如果内存不够了还可以请求使用虚拟内存,而Android系统可没这个机制。
















weixin_38703468
- 粉丝: 14
- 资源: 951
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制

评论0