Android下怎么诊断/防止程序的内存泄漏/内存碎片,大家有没什么好方法

xqhrs232 2011-02-16 09:43:25
Android下怎么诊断/防止程序的内存泄漏/内存碎片,大家有没什么好方法
...全文
10179 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
xqhrs232 2012-05-25
  • 打赏
  • 举报
回复
我定制的系统运行越来越慢,原来存在吃内存的情况。监视可用内存是越来越少。


ActivityManager.MemoryInfo

public long availMem The total available memory on the system.
public boolean lowMemory Set to true if the system considers itself to currently be in a low memory situation.
public long threshold The threshold of availMem at which we consider memory to be low and start killing background services and other non-extraneous processes.


xqhrs232 2012-05-25
  • 打赏
  • 举报
回复
Android内存管理
http://tianhe945.blog.163.com/blog/static/2017531222012417134797/



6.Android框架,每一个进程都有内存限制,可以采用以下方法来躲开这个问题

每一个程序可以通过android.os.Debug.getNativeHeapAllocatedSize()查看进程可以使用的内存。

一种方法是从本机代码分配内存。使用NDK的(本地开发工具包)和JNI,它可以从C级(如的malloc / free或新/删除),这种分配的内存分配,不计入内存的限制。

另一种方法,效果很好,图像,是使用OpenGL纹理 - 纹理内存同样不被计入内存的限制

据说可以达到300M的内存使用,哪位朋友测试了可以告诉我,这个方法的可行性。



xqhrs232 2012-05-25
  • 打赏
  • 举报
回复
zy1235678 2012-03-09
  • 打赏
  • 举报
回复
收藏了,这个真的很有用!
w237or45 2012-03-09
  • 打赏
  • 举报
回复
主要是bitmap 容易内存溢出 这是我的解决方案

http://blog.csdn.net/w237or45/article/details/7333782
OtherEyeOpen 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 hawkofwinter 的回复:]
Java内存也泄露?
[/Quote]

确切地说是加速回收,防止溢出。因为android限定app使用大小。
leer168 2011-09-15
  • 打赏
  • 举报
回复
Mark
Quannenggou 2011-08-02
  • 打赏
  • 举报
回复
http://wenku.baidu.com/view/bf788a02b52acfc789ebc9c4.html
xx 2011-08-02
  • 打赏
  • 举报
回复
我想说,LZ的本意很好,但是这种排版,一般人看不起来。。。
中才德创 2011-07-31
  • 打赏
  • 举报
回复
有没简单的监控内存泄露的工具?
中才德创 2011-07-31
  • 打赏
  • 举报
回复
Java内存也泄露?
  • 打赏
  • 举报
回复
太好了,总结的很全!!
loozlv 2011-07-22
  • 打赏
  • 举报
回复
很好的帖子,帮顶
pengzhenwanli 2011-03-04
  • 打赏
  • 举报
回复
我最近也在查这个问题,MAT不是很好用。有些引用找不到是谁的。
不知道还有没有更好的方法
qthsrs232 2011-02-16
  • 打赏
  • 举报
回复
有效解决android加载大图片内存泄露的问题

http://zhiweiofli.javaeye.com/blog/905066
qthsrs232 2011-02-16
  • 打赏
  • 举报
回复
解决Gallery载入大图片导致OutOfMemoryError内存溢出问题
http://www.pocketdigi.com/20101029/138.html


在使用Gallery控件时,如果载入的图片过多,过大,就很容易出现OutOfMemoryError异常,就是内存溢出。这是因为Android默认分配的内存只有8M,而载入的图片如果是JPG之类的压缩格式,在内存中展开时就会占用大量的空间,也就容易内存溢出。这时可以用下面的方法解决:

1
2
3
4
5
6
7
8
9
10
ImageView i = new ImageView(mContext);
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 10;
//貌似这个options的功能是返回缩略图,10即表示长和宽为原来的1/10,即面积为原来的1/100
//缩略图可以减少内存占用
Bitmap bm = BitmapFactory.decodeFile(lis.
get(position).toString(),options);
i.setImageBitmap(bm);
bm.recycle();
//资源回收

xqhrs232 2011-02-16
  • 打赏
  • 举报
回复
xqhrs232 2011-02-16
  • 打赏
  • 举报
回复
android 加载图片 内存溢出的问题



我的代码如下

is = new FileInputStream(new File(baseMagazinePath + this.bookId + "/" + fileList[currentImgNo] + ".png"));
iv.setImageDrawable(Drawable.createFromStream(is, "myStream"));

有时候出现内存溢出

改为
is = new FileInputStream(new File(baseMagazinePath + this.bookId + "/" + fileList[currentImgNo] + ".png"));
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeStream(is, null, opts);
iv.setImageBitmap(bitmap);

就好了。

xqhrs232 2011-02-16
  • 打赏
  • 举报
回复
android显示图片内存溢出问题
http://d.187000.com/d_android_tupian_neicun_wenti.html

最近在做一个应用,要循环显示图片,可是图片很大,每个5M左右,如果按图片原来大小显示,在显示两个图片之后必会内存溢出,谁能给个图片压缩显示方法,谢谢!!!
--------------------------------------------------------------------------------

以下为可能性最大的答案:
........5M
这个就算recycle也没用了...
我觉得你可以这样,创建一张全局的bitmap(当然要按最大的创建),然后每个图片读取都按照字节的方式读出来,之后set个体这个全局的bitmap,显示的时候就显示这个全局的,一个用完就清空一下,在读取另一张,这样保证只有一个bitmap在占用内存....
--------------------------------------------------------------------------------
recycle并不能及时回收图片,只是告诉虚拟机我需要回收该图片资源,Java中没有手工回收资源的方法。。
1、修改android底层的内存限制。。。放开内存
2、用楼上的做法进行缩放, opts.inSampleSize = 2;表明缩放为原图的长宽各一半。。。用弱引用引用图片,保证及时的回收。。


--------------------------------------------------------------------------------
执行了bitmap.recycle()后,直接让bitmap对象赋予null,这样可以立即释放的。不过要说的是android处理大图片很愁人的,ram太小了,没办法,vm限制也大,哈哈
qthsrs232 2011-02-16
  • 打赏
  • 举报
回复
J2ME中的内存泄漏问题

http://blog.sina.com.cn/s/blog_4b8ab89701009n5k.html


J2ME中最常使用的资源无非是图片和声音。为了提高游戏的运行速度,我们通常把它们声明为全局变量,又由于手机的内存的关系,我们不能把这些资源同时加载进内存,所以我们会在使用的时候导入资源(创建对象),而把暂时不需要的资源(图片或声音)对象赋值为null(当然这是我的做法,不知道是否和大家一样)。在这期间如果处理不好,就会有些资源对象的在内存中没有清除干净,就会造成内存泄漏,结果就是可用内存越来越小。下面我就举例说明。
?n u M+|$c;t5j0  Android J2ME u(U@1| u%FIz-a!B
  1.图片资源Android J2ME ` V(B;b d2KU
  要点:要为每一个图片资源声明一个对象变量
x sZ7L�ts[3E~2m0  假设在一个程序声明了2个图片对象:
8j;db7S!S ^.BV�l0      Image pic1,pic2;
os&E+Q\"M#B6x0  如果在某一时刻要使用pic1和pic2则:
/T ov3x0u){ l0      if(pic1==null)pic1=Image.createImage("/1.png");Android J2ME !dk3n[D$J!@#Q
      if(pic2==null)pic2=Image.createImage("/2.png");Android J2ME )S'O�e0p3l{'S#L
  当这些图片用完后,就应当:
(b{6wQU3u0      pic1=null;
.iWl3R,~%d0      pic2=null;
%A7o VR+m@H0  如果需要使用另外两个图片3.png和4.png,则最好另声明两个变量对象pic3,pic4来导入它们,不要使用pic1,pic2变量来导入这两个图片,如:Android J2ME (oQ @,m_
      if(pic1==null)pic1=Image.createImage("/3.png");//不要这样做Android J2ME "vI"b9UJm s
      if(pic2==null)pic2=Image.createImage("/4.png");//不要这样做Android J2ME 3_*L\ eFEl__
  因为这样做会影响垃圾收集器对pic1,pic2对象的回收工作,从而造成内存回收不干净。
.q8lz-[(lj0  Android J2ME ;]G*D4m:Bh\.@_
  2.声音资源(不同的平台对声音的处理方式不同)Android J2ME m8H2C QK@B
  Android J2ME /I{(j]@
  要点:和图片资源一样,另外在回收声音资源一定要停止声音的播放;还有在每次开始播放声音前,也要先判断一下声音的状态(简单点,直接调用stop,先让声音停下来,然后再播放),如果不先停止声音的播放,再调用其运行播放,可能会生成无法回收的对象(这是本人猜测的)造成内存的泄漏。
r o,OSS0  
&YP;k6Z0H i0  如:
+d{K[jFcB0  假设sound为声音对象jAndroid J2ME 3V.}4KTw1F!j+h�L.q!R%KN
  释放sound资源:
9d8J6HY Ne$s{D4K;I0       if(sound!=null)
!V]S0X.m#}3c#f0       {Android J2ME :O6C$L c
加载更多回复(21)

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧