博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Application】ANDROID application与内存泄漏的关系
阅读量:6919 次
发布时间:2019-06-27

本文共 1312 字,大约阅读时间需要 4 分钟。

hot3.png

5:MemoryLeak

在Java中内存泄漏是只,某个(某些)对象已经不在被使用应该被gc所回收,但有一个对象持有这个对象的引用而阻止这个对象被回收。比如我 们通常会这样创建一个View TextView tv = new TextView(this);这里的this通常都是Activity。所以这个TextView就持有着这个Activity的引用。下面看张图 (Google IO 2011 ppt中抄得)

通常情况下,当用户转动手机的时候,android会重新调用OnCreate()方法生成一个新的Activity,原来的 Activity应该被GC所回收。但如果有个对象比如一个View的作用域超过了这个Activity(比如有一个static对象或者我们把这个 View的引用放到了Application当中),这时候原来的Activity将不能被GC所回收,Activity本身又持有很多对象的引用,所以 整个Activity的内存被泄漏了。
备注:经常导致内存泄漏核心原因: keeping a long-lived reference to a Context.持有一个context的对象,从而gc不能回收。 情况如下:

1.一个View的作用域超出了所在的Activity的作用域,比如一个static的View或者把一个View cache到了application当中 etc
理解:内存:注意静态的数据和缓存中的数据;注意释放;

2.某些与View关联的Drawable的作用域超出了Activity的作用域。

3.Runnable对象:比如在一个Activity中启用了一个新线程去执行一个任务,在这期间这个Activity被系统回收了, 但Runnalbe的 任务还没有执行完毕并持有Activity的引用而泄漏,但这种泄漏一般来泄漏一段时间,只有Runnalbe的线程执行完闭,这个 Activity又可以被正常回收了。

4.内存类的对象作用域超出Activity的范围:比如定义了一个内存类来存储数据,又把这个内存类的对象传给了其它Activity 或者Service等。因为内部类的对象会持有当前类的引用,所以也就持有了Context的引用。解决方法是如果不需要当前的引用把内部类写成static或者,把内部类抽取出来变成一个单独的类,或者把避免内部对象作用域超出Activity的作用域。out Of Memery Error 在android中每一个程序所分到的内存大小是有限的,如果超过了这个数就会报Out Of Memory Error。 android给程序分配的内存大小与手机硬件有关,以下是一些手机的数据:

G1:16M Droid:24 Nexus One:32M Xoom:48Ms
所以尽量把程序中的一些大的数据cache到本地文件。以免内存使用量超标。
记得数据传递完成之后,把存放在application的HashMap中的数据remove掉,以免发生内存的泄漏

转载于:https://my.oschina.net/u/199776/blog/745276

你可能感兴趣的文章
kafka-命令行创建topic
查看>>
《数据结构与算法分析——c语言描述》读后笔记
查看>>
windows系统如何查看物理cpu核数,内存型号等
查看>>
salt-key参数
查看>>
最安全的TurboMail邮件系统的安全防范技术介绍
查看>>
通向架构师的道路(第十二天)之Axis2 Web Service(三)
查看>>
我的友情链接
查看>>
pygame转换图片时 No video mode has been set 的错误
查看>>
linux删除某个文件夹下30天前的文件
查看>>
Fragment(碎片)
查看>>
hadoop地址
查看>>
linux
查看>>
Go语言gdb调试踩坑
查看>>
用户管理 之 在Linux系统中,批量添加用户的操作流程
查看>>
Hibernate fetch属性详解,很清楚
查看>>
关于biztel以及代理的一些相关问题
查看>>
js里面动态赋值 对象属性名
查看>>
vue全家桶之常用选项(四)
查看>>
我的友情链接
查看>>
谁来减轻程序员的“辛苦”
查看>>