Android开发过程中内存泄露检测

转自 http://blog.csdn.net/shimiso/article/details/44677041

一、内存泄露

内存泄漏会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。

内存泄漏可能不严重,甚至能够被常规的手段检测出来。在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放。这表示一个短暂运行的应用程序中的内存泄漏不会导致严重后果。

在以下情况,内存泄漏导致较严重的后果:

1)程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);
2)新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;
3)程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;
4)泄漏在操作系统内部发生;
5)泄漏在系统关键驱动中发生;
6)内存非常有限,比如在嵌入式系统或便携设备中;
7)当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢失只能通过重启来恢复。

二、内存泄漏检测工具

当一个Java对象已经没有其他对象引用它时,Java的垃圾回收器会将其回收并释放内存。

一个Java的Heap Dump文件指的是在一个时间点上Java对象的内存镜像导出文件。它包括了所有的对象、字段、原始类型和对象引用。它可以指示当JVM产生OutOfMemory错误的情况下自动创建一个堆转储。

使用Eclipse MAT(Eclipse Memory Analyser),有助于图形化基于Java堆转储的对象引用,并提供工具以发现潜在的内存泄露。为了能让Java虚拟机(JVM)在发生OutOfMemory错误时生成内存镜像文件,我们可以使用-XX:+HeapDumpOnOutOfMemoryError选项,如图21.1所示。

安装Eclipse MAT的步骤如下:

1)启动Eclipse,点击Help -> Intall New Software…;
2)点击输入栏右侧小箭头,选择”Juno”(不同版本要找到和自己版本名称对应的选项);
3)等待列表更新完毕,找到并展开”General Purpose Tools”;
4)选中并下载其中的”Memory Analyser (Incubation)”和”Memory Analyser (Charts)”两项。
5)之后根据提示进行安装。

三、MAT使用示例

1)创建工程

新建Android 工程 “com.devdiv.test.mat_test”。并且新建如下类,然后运行该工程。

[java] view plaincopy

  1. package com.devdiv.test.mat_test;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. public class MainActivity extends Activity {
  7. List<String> list = new ArrayList<String>();
  8. //    private PersonInfo person = new PersonInfo();
  9. @Override
  10. public void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. new Thread () {
  14. @Override
  15. public void run() {
  16. while (true){
  17. MainActivity.this.list.add("OutOfMemoryError soon");
  18. }
  19. }
  20. }.start();
  21. }
  22. }

2)分析内存

要获得.hprof内存镜像文件,你可以在进程运行过程中,切换到DDMS的透视图页面,选中您要查看内存镜像的进程,点击“Dump HPROF file”即可。


生成的hprof文件会默认使用MAT打开,选择“Leak Suspects Report”后,点击Finish按钮。

图16-2 用MAT打开内存镜像文件

经过一段时间的初始化后,就能够直观地看到关于内存泄露的饼图,如下图所示:

图16-3 内存泄露饼图

然后就可以查看相关的内存泄露,如下图所示:

时间: 2024-10-25 07:44:00

Android开发过程中内存泄露检测的相关文章

LeakCanary Android 和 Java 内存泄露检测。

开始使用 在 build.gradle 中加入引用,不同的编译使用不同的引用: dependencies { debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3' } 在 Application 中: public class ExampleApplication extends Appl

Android 内存泄露检测工具 LeakCanary

LeakCanary 是 Android 和 Java 内存泄露检测框架.LeakCanary 可以用更加直白的方式将内存泄露展现在我们的面前. 开始使用 在 build.gradle 中加入引用,不同的编译使用不同的引用: ? 1 2 3 4 dependencies {    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'    releaseCompile 'com.squareup.leakcanary:leak

内存泄露检测工具——LeakCanary

很简单:我们不是创建服务不是为了赚钱:我们赚钱是为了提供更好的服务.我们认为这才是做事的态度. 学习使用Java的同学都应该知道,Java的JVM给我们提供的垃圾回收机制是极为好用的.但是我们也很清楚,垃圾回收机制不是万能的,使用不当很容易造成内存泄露.之前我们也介绍过Java中常用的内存泄露检测工具MAT,目前Java程序最常用的内存分析工具应该是MAT(Memory Analyzer Tool),它是一个Eclipse插件,同时也有单独的RCP客户端. 不熟悉MAT的同学,或者对Java垃圾

Android 源码系列之&lt;十三&gt;从源码的角度深入理解LeakCanary的内存泄露检测机制(中)

转载请注明出处:http://blog.csdn.net/llew2011/article/details/52958563 在上篇文章Android 源码系列之<十二>从源码的角度深入理解LeakCanary的内存泄露检测机制(上)中主要介绍了Java内存分配相关的知识以及在Android开发中可能遇见的各种内存泄露情况并给出了相对应的解决方案,如果你还没有看过上篇文章,建议点击这里阅读一下,这篇文章我将要向大家介绍如何在我们的应用中使用square开源的LeakCanary库来检测应用中出

Android工具:LeakCanary—内存泄露检测神器

一.LeakCanary简介LeakCanary是Square公司开源的一个检测内存的泄露的函数库,可以方便地和你的项目进行集成,在Debug版本中监控Activity.Fragment等的内存泄露:LeakCanary集成到项目中之后,在检测到内存泄露时,会发送消息到系统通知栏.点击后打开名称DisplayLeakActivity的页面,并显示泄露的跟踪信息,Logcat上面也会有对应的日志输出.同时如果跟踪信息不足以定位时,DisplayLeakActivity还为开发者默认保存了最近7个d

Android 源码系列之&lt;十四&gt;从源码的角度深入理解LeakCanary的内存泄露检测机制(下)

转载请注明出处:http://blog.csdn.net/llew2011/article/details/52958567 在上边文章Android 源码系列之<十三>从源码的角度深入理解LeakCanary的内存泄露检测机制(中)由于篇幅原因仅仅向小伙伴们讲述了在Android开发中如何使用LeakCanary来检测应用中出现的内存泄露,并简单的介绍了LeakCanary的相关配置信息.根据上篇文章的介绍我们知道LeakCanary为了不给APP进程造成影响所以新开启了一个进程,在新开启的

Android中内存泄露与如何有效避免OOM总结

一.关于OOM与内存泄露的概念 我们在Android开发过程中经常会遇到OOM的错误,这是因为我们在APP中没有考虑dalvik虚拟机内存消耗的问题. 1.什么是OOM OOM:即OutOfMemoery,顾名思义就是指内存溢出了.内存溢出是指APP向系统申请超过最大阀值的内存请求,系统不会再分配多余的空间,就会造成OOM error.在我们Android平台下,多数情况是出现在图片不当处理加载的时候. Android系统为每个应用程序分配的内存有限,当一个应用中产生的内存泄漏比较多时,就难免会

Android中内存泄露

Android程序主要是由java代码写成的,我们都知道java在内存回收方面有着自己的一套体系,完全不需要coder来做内存销毁,但是在编程的时候还是有内存泄露的事儿发生,这种情况一般是因为什么呢? 首先我们要明确的是java的内存自动回收机制是怎么一回事:在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,程序员不需要通过调用函数来释放内存,但它只能回收无用并且不再被其它对象引用的那些对象所占用的空间. Java的内存垃圾回

Windows系统中内存泄露与检测工具及方法

1.检测需要使用的工具:windbg工具.检测前,需要先安装windbg工具.安装了该工具后,会在安装目录下有一个umdh工具.假设windbg安装在以下目录下:D:\Program Files\Debugging Tools for Windows (x86) 2.内存泄露检测技巧2.1 运行cmd窗口,将路径设置到安装路径下:2.2 在该cmd窗口中设置环境变量_NT_SYMBOL_PATH:D:\Program Files\Debugging Tools for Windows (x86)