gridview 内存溢出

最近做开发因为使用了大量的图片浏览,单一在一个页面不停滑动图片还好.

怎么来回几个页面不停跳两次内存就开始溢出了?

然后我单独拿出一个页面不停测试finish后进去 进去后finish,

内存也还是不停的增加,好吧 我要花点心思来检查下代码到底是那里的资源没释放

检查内存消耗问题

ddms -- heap -- dataobect  -- total size

习惯性的图解

借用网上的一段文字说明

内存监测工具 DDMS --> Heap

无论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方。Android tools中的DDMS就带有一个很不错的内存监测工具Heap(这里我使用eclipse的ADT插件,并以真机为例,在模拟器中的情况类似)。用 Heap监测应用进程使用内存情况的步骤如下:
1. 启动eclipse后,切换到DDMS透视图,并确认Devices视图、Heap视图都是打开的;
2. 将手机通过USB链接至电脑,链接时需要确认手机是处于“USB调试”模式,而不是作为“Mass Storage”;
3. 链接成功后,在DDMS的Devices视图中将会显示手机设备的序列号,以及设备中正在运行的部分进程信息;
4. 点击选中想要监测的进程,比如system_process进程;
5. 点击选中Devices视图界面中最上方一排图标中的“Update Heap”图标;
6. 点击Heap视图中的“Cause GC”按钮;
7. 此时在Heap视图中就会看到当前选中的进程的内存使用量的详细情况。
 说明:
a) 点击“Cause GC”按钮相当于向虚拟机请求了一次gc操作;
b) 当内存使用信息第一次显示以后,无须再不断的点击“Cause GC”,Heap视图界面会定时刷新,在对应用的不断的操作过程中就可以看到内存使用的变化;
c) 内存使用信息的各项参数根据名称即可知道其意思,在此不再赘述。
  如何才能知道我们的程序是否有内存泄漏的可能性呢。这里需要注意一个值:Heap视图中部有一个Type叫做data object,即数据对象,也就是我们的程序中大量存在的类类型的对象。在data object一行中有一列是“Total Size”,其值就是当前进程中所有Java数据对象的内存总量,一般情况下,这个值的大小决定了是否会有内存泄漏。可以这样判断:
a) 不断的操作当前应用,同时注意观察data object的Total Size值;
b) 正常情况下Total Size值都会稳定在一个有限的范围内,也就是说由于程序中的的代码良好,没有造成对象不被垃圾回收的情况,所以说虽然我们不断的操作会不断的生成很多对象,而在虚拟机不断的进行GC的过程中,这些对象都被回收了,内存占用量会会落到一个稳定的水平;
c) 反之如果代码中存在没有释放对象引用的情况,则data object的Total Size值在每次GC后不会有明显的回落,随着操作次数的增多Total Size的值会越来越大,
  直到到达一个上限后导致进程被kill掉。
d) 此处已system_process进程为例,在我的测试环境中system_process进程所占用的内存的data object的Total Size正常情况下会稳定在2.2~2.8之间,而当其值超过3.55后进程就会被kill。
    总之,使用DDMS的Heap视图工具可以很方便的确认我们的程序是否存在内存泄漏的可能性。

好了 第一步检测出是那里的问题了

就开始第二步 对内存泄漏定位.

Mat(memory analyzer tools)是我们常用的用来定位内存泄露的工具,如果你使用ADT,并且安装了MAT的eclipse插件,点击这个图标

关于mat的安装及使用请参考http://www.blogjava.net/rosen/archive/2010/05/21/321575.html

 

通过mat 查出最耗内存的是我使用的groidview.

我一直想的都是图片加载照成的内存溢出,但是我把图片加载代码注释,只加载gridview,发现内存还是不停的往上飙.

估计gridview也是造成内存溢出的一大部分原因.

即使我finish掉这个页面 再进入 他不会降低原来的内存值 而是在原来的内存值上不停往上飙,我就想 如何去释放掉gridview.

可能有可能方式,但是什么都是孤军奋战,自己还没找到原因,加油找把!!!!

通过测试 我发现一个问题.

我在开发中会写一个基类 

在每个类里面去继承这个基类,然后在退出的时候调用ExitApplication.getInstance().exit();

这样一些可能大家都有共鸣,因为这是网上流传的一种方式 在退出应用的时候.循环finish

掉所有的activty.在我从a 跳转到我这个非常耗内存的gridview(占时称为b)类,然后返回在进去返回在进去

a -- b 我是intent过去 finish b ---返回 b inent过去 finish a 这样来回finish,

然后检测发现我的 b 类被 被创建的 N次对象, 一次为700k , 就有N*700k的内存消耗.

因为我所有类都基础这个基类 , 对象有地方被引用,虚拟机就不会回收资源,我想大概原因是这样的.

下一步 删掉以前的做法,继续检查内存使用情况.

果不其然,果然是把所有类装载在一起造成的原因,以后不能用原来那种写法咯.

 

 

 

转载于:https://www.cnblogs.com/elena76/p/3499497.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值