Android 内存泄漏分析(MemoryAnalyzer)

MemoryAnalyzer的介绍及使用请参见:

 

java 内存泄露分析(jmap + MemoryAnalyzer)

 

 

Android 内存泄漏分析

编写如下代码(就是一个按钮加一个imageview,不停地点击button,就会翻转90度图片)

 

    Bitmapbt;

    @Override

    protectedvoidonCreate(BundlesavedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        rotate = (Button) findViewById(R.id.button1);

        view = (ImageView) findViewById(R.id.imageView1);

        view.setDrawingCacheEnabled(true);

        rotate.setOnClickListener(newOnClickListener() {

           

            @Override

            publicvoidonClick(Viewarg0) {

                // TODO Auto-generated method stub

               

                bt = drawableToBitmap(view.getDrawable());

                view.setImageBitmap(rotateBitmap(bt,90));

                view.setDrawingCacheEnabled(true);

                //bt.recycle();

                //bt = null;

               

            }

        });

}

 

效果执行如下:

 

使用DDMS插件进行进程内存跟踪:

 

运行一段时间以后,导出当前进程中的内存快照文件。

 

 

打开 memery analyzer进行内存文件分析

 

转换一下,内存dump文件的格式(android 虚拟机与java虚拟机差异)

 

 

工具分析的内存疑似泄漏点:

 

发现疑似第二处为应用的泄漏点:

 

 

Android 常见内存泄漏错误

1、集合中对象没清理造成的内存泄露

  我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。

2、资源对象没关闭造成的内存泄露

 

资源性对象比如(CursorFile文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存。它们的缓冲不仅存在于java虚拟机内,还存在于java虚拟机外。如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄露。因为有些资源性对象,比如SQLiteCursor(在析构函数finalize(),如果我们没有关闭它,它自己会调close()关闭),如果我们没有关闭它,系统在回收它时也会关闭它,但是这样的效率太低了。因此对于资源性对象在不使用的时候,应该调用它的close()函数,将其关闭掉,然后才置为null.在我们的程序退出时一定要确保我们的资源性对象已经关闭。

 

举例(隐形cursorclose释放资源)

Cursor c = getServerIdCursor(serverId);

try {

    if (c.moveToFirst()) {

        Uri uri = ContentUris.withAppendedId(

                RawContacts.CONTENT_URI, c.getLong(0));

        uri = Uri.withAppendedPath(uri,

                RawContacts.Entity.CONTENT_DIRECTORY);

        EntityIterator entityIterator = RawContacts

                .newEntityIterator(mContentResolver.query(

                        uri, null, null, null, null));

        if (entityIterator.hasNext()) {

            entity = entityIterator.next();

        }

        entityIterator.close();// 释放cursor防止内存泄漏 fix by

                               // jhy

        userLog("Changing contact ", serverId);

    }

} finally {

    if (c != null) {

        userLog("Changing contact releaseing------ cursor!");

        c.close();

        c = null;

    }

}

3、Bitmap没调用recycle()

  Bitmap对象在不使用时,我们应该先调用recycle()释放内存,然后才它设置为null.

  虽然recycle()从源码上看,调用它应该能立即释放Bitmap的主要内存,但是测试结果显示它并没能立即释放内存。但是我它应该还是能大大的加速Bitmap的主要内存的释放。

4、代码内跨activity对象引用造成的对象还被引用,释放不了。

android SoftReference WeakReference的使用

 

Soft Reference 虽然和 Weak Reference 很类似,但是用途却不同。被 Soft Reference 指到的对象,即使没有任何 Direct Reference,也不会被清除。一直要到 JVM 内存不足时且没有 Direct Reference 时才会清除,SoftReference 是用来设计 object-cache 之用的。如此一来 SoftReference 不但可以把对象 cache 起来,也不会造成内存不足的错误(OutOfMemoryError

 

 

http://www.cnblogs.com/charley_yang/archive/2010/10/22/1857926.html

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android内存分析是指通过分析应用程序在运行过程中的内存使用情况,找出内存泄漏、内存溢出等问题,以优化应用程序的性能和稳定性。常用的工具有Android Studio提供的内存分析器和MAT(Memory Analyzer Tool)等。 在进行Android内存分析时,可以采取以下步骤: 1. 监测内存使用:使用Android Studio提供的内存监视工具,观察应用程序在运行过程中的内存使用情况,包括堆内存和非堆内存的使用情况。 2. 寻找内存泄漏:通过观察内存使用情况,查找是否有对象没有被正确释放,从而导致内存泄漏。可以使用内存分析器来分析堆快照,查找对象引用关系,找出不再需要的对象。 3. 优化内存占用:观察哪些对象占用了大量内存,并尝试优化其内存占用。例如,可以考虑使用弱引用或软引用来管理对象,减少不必要的缓存等。 4. 避免内存溢出:注意合理管理大数据集合、避免频繁创建大对象、及时释放不需要的资源等,以避免应用程序因为内存溢出而崩溃。 5. 使用内存分析工具:Android Studio提供了内存分析器,可以帮助开发者分析内存使用情况,找出内存泄漏和优化内存占用。MAT是一款Java堆内存分析工具,也可用于Android内存分析。 通过进行Android内存分析,开发者可以及时发现和解决应用程序的内存问题,提升应用程序的性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值