Android中的内存泄漏和内存溢出.md

Android中的内存泄漏和内存溢出.md,第1张

内存泄漏是因为持有对象长期引用,导致对象无法被 GC 回收。

为了避免这种情况,我们可以选择在对象生命周期结束的时候,解除绑定,将引用置为空,或者使用弱引用。

LeakCanary的内存泄露提示一般会包含三个部分:

第一部分(LeakSingle类的sInstance变量)引用第二部分(LeakSingle类的mContext变量), 导致第三部分(MainActivity类的实例instance)泄露.

当我们向上寻找,一直寻找到GC Root的时候,此对象不会进行回收,例如,一个Activity。那么如果我们向上寻找,直到找到GC Root对象的时候,就说明它是不可以回收的,例如,我定义了一个int a;但是这个数据,我整个页面或者说整个项目都没有用到,则这个对象会被GC掉。

一、内存溢出现在的智能手机内存已经足够大,但是对于一个应用程序来说智能手机当中稀缺的内存,仍然是应用程序的一大限制。在Android应用程序开发当中,最常见的内存溢出问题(OOM)是在加载图片时出现的,尤其是在不知道图片大小的情况下。潜在的内存溢出 *** 作主要包括以下几点:1、从网络当中加载用户特定的图片。因为直到我们在下载图片的时候我们才知道图片的大小。2、向Gallery加载图片。因为现在智能手机的摄像头有很高的分辨率,在加载图片的时候需要最图片进行处理,然后才能正常的使用。请注意一点,Android系统是从系统全局的观念来分配内存以加载图片的,这就意味着,即使你的应用有足够大的内存可用,内存溢出问题(out of memroy,OOM)仍然可能出现,因为所有的应用共享一个加载图片的内存池(我们使用BitmapFactory进行解析)。二、解决内存溢出问题原文(Downsampling为了好理解,解释为,程序A)。程序A通过调整像素,同时使其均衡化来降低图片的分辨率。因为不管问题图片是因为太大而不能再手机上正常显现,这个图片都会缩短其宽度以在ImageView当中显示,当图片在ImageView当中显示时,我们会因为加载一些没有必要的原始图片而浪费掉内存。因此,更加有效的加载图片的时机是在其初始化处理的时候。以下是处理代码:1: private static Bitmap getResizedImage(String path, byte[] data, int targetWidth){2:3: BitmapFactory.Options options = new BitmapFactory.Options()14: options.inSampleSize = ssize15:16: Bitmap bm = null17: try{18: bm = decode(path, data, options)19: }catch(OutOfMemoryError e){39: result = result * 240:41: }42:43: return result44: }三、AQuery当在Android应用程序开发当中使用AQuery组件时,处理这个问题会变的更加的简单。

现在App开发时很多界面都是使用H5进行展示,但是在加载H5页面的过程中,如果要展示的界面中图片过多就会出现内存过多的问题,并且在退出界面后,即使在Activity的onDestory中执行了webView.destory()或者webview = null,对内存回收也没有效果。

针对上面的问题采取以下方案:

Webview时加载H5界面时,使用新进程加载,退出界面时将进程杀掉。

开启新的Activity时,在Android的清单文件中进行标记这个Activity在一个单独的进程

在这个Activity中的onDestory中,杀掉进程

执行之后,内存释放会特别明显,但是由于通过进程来处理页面,会引起当前页面和其它页面间的通信发生问题,如果需要进行通信,要注意进程间通信问题 。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7779182.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存