zoukankan      html  css  js  c++  java
  • 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在CODE上查看代码片派生到我的代码片
     
    1. package com.devdiv.test.mat_test;  
    2.    
    3. import java.util.ArrayList;  
    4. import java.util.List;  
    5.    
    6. import android.app.Activity;  
    7. import android.os.Bundle;  
    8.    
    9. public class MainActivity extends Activity {  
    10.    
    11.     List<String> list = new ArrayList<String>();  
    12. //    private PersonInfo person = new PersonInfo();  
    13.        
    14.     @Override  
    15.     public void onCreate(Bundle savedInstanceState) {  
    16.         super.onCreate(savedInstanceState);  
    17.         setContentView(R.layout.activity_main);  
    18.            
    19.         new Thread () {  
    20.             @Override  
    21.             public void run() {     
    22.                 while (true){  
    23.                         MainActivity.this.list.add("OutOfMemoryError soon");  
    24.                 }  
    25.             }  
    26.         }.start();  
    27.     }  
    28.      
    29. }  

    2)分析内存

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


    QQ截图20150325221152
    生成的hprof文件会默认使用MAT打开,选择“Leak Suspects Report”后,点击Finish按钮。
    QQ截图20150325221224
    图16-2 用MAT打开内存镜像文件

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

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

  • 相关阅读:
    GODIAG GD801 ODOMETER里程改正指南车清单
    XTOOL A80 Pro(H6 Pro)使用提示+常见问题解答
    Vident IAUTO702 Pro 2012 Peugeot 308喷油器编码:是否支持?
    es创建模板
    docker 帮助信息
    聊聊白盒测试、黑盒测试
    Go 通过结构体指定字段进行排序
    Go语言 之结构体数组 赋值
    PHP中json_encode与json_decode
    golang sync WaitGroup
  • 原文地址:https://www.cnblogs.com/mjblogs/p/4390651.html
Copyright © 2011-2022 走看看