OOM(OutOfMemoryError) 相信是所有 Android 开发者遇到的最多的 Error,因此找出个中缘由是非常重要。

这里用到的分析工具主要是 Eclipse MAT 插件http://www.eclipse.org/mat/

Eclipse MAT(Memory Analyzer Tool)主要用于分析Java程序OOM 时 JVM 的 Heap dump文件(HPROF格式的二进制文件)。

一般的,Java 程序要生成这样的dump文件,需设置 JVM 启动参数-XX:-HeapDumpOnOutOfMemoryError(同样适用于Android应用)。

Android应用生成 dump 文件可以使用 DDMS,点击Devices工具”Dump HPROF file”,按提示框保存文件即可(如果安装了 MAT则会自动打开文件)。

具体就不再赘述… 相关阅读:

  • MAT - Tutorial
  • MAT Wiki
  • JVM 内存结构

这里简单介绍一下用 MAT分析 Android 应用的内存泄露。

  1. 首先安装 MAT
    在http://www.eclipse.org/mat/downloads.php下载或者用Update Sitehttp://download.eclipse.org/mat/1.4/update-site/安装
  2. 在 DDMS 中选择需要调试的设备及你的应用进程
  3. 点击“Dump HPROF file”按钮提取 dump 文件(需稍许等待)
  4. 自动用MAT 打开文件,选择“Leak Suspects Report”
  5. 睁大你的双眼揪出最有可能导致 OOM 的因素吧!

测试代码:

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package net.yrom.mat;

// imports...

public class MainActivity extends Activity {    @Override
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    SparseArray<Bitmap> bitmaps = new SparseArray<Bitmap>();
    Random random = new Random();
    public void rock(View v){        try {            for(int i=0;i<Integer.MAX_VALUE;i++){                bitmaps.append(i, Bitmap.createBitmap(random.nextInt(100)+1, random.nextInt(100)+1, Bitmap.Config.ARGB_8888));
            }
        } catch (OutOfMemoryError e) {            Log.e("@@@", "Got OOM!!!");
        }
    }
}

布局中只有一个按钮,点击后即执行rock(view)

手机开始疯狂的GC,几秒后即OOM:

... ...
08-29 23:15:28.625: D/dalvikvm(1016): WAIT_FOR_CONCURRENT_GC blocked 255ms
08-29 23:15:28.625: I/dalvikvm-heap(1016): Forcing collection of SoftReferences for 3576-byte allocation
08-29 23:15:28.705: I/dalvikvm-heap(1016): Clamp target GC heap from 199.988MB to 192.000MB
08-29 23:15:28.705: D/dalvikvm(1016): GC_BEFORE_OOM freed 9K, 1% free 196404K/196608K, paused 79ms, total 79ms
08-29 23:15:28.770: I/dalvikvm-heap(1016): Clamp target GC heap from 199.991MB to 192.000MB
08-29 23:15:28.770: D/dalvikvm(1016): GC_FOR_ALLOC freed 0K, 1% free 196408K/196608K, paused 65ms, total 65ms
08-29 23:15:28.770: I/dalvikvm-heap(1016): Forcing collection of SoftReferences for 6836-byte allocation
08-29 23:15:28.845: I/dalvikvm-heap(1016): Clamp target GC heap from 199.991MB to 192.000MB
08-29 23:15:28.845: D/dalvikvm(1016): GC_BEFORE_OOM freed 0K, 1% free 196408K/196608K, paused 77ms, total 77ms
08-29 23:15:28.845: E/dalvikvm-heap(1016): Out of memory on a 6836-byte allocation.
08-29 23:15:28.845: I/dalvikvm(1016): "main" prio=5 tid=1 RUNNABLE
08-29 23:15:28.845: I/dalvikvm(1016):   | group="main" sCount=0 dsCount=0 obj=0x40c269a0 self=0x6cac5010
08-29 23:15:28.845: I/dalvikvm(1016):   | sysTid=1016 nice=0 sched=0/0 cgrp=apps handle=1074820060
08-29 23:15:28.845: I/dalvikvm(1016):   | state=R schedstat=( 0 0 0 ) utm=100 stm=73 core=3
08-29 23:15:28.845: I/dalvikvm(1016):   at android.graphics.Bitmap.nativeCreate(Native Method)
08-29 23:15:28.850: I/dalvikvm(1016):   at android.graphics.Bitmap.createBitmap(Bitmap.java:689)
08-29 23:15:28.850: I/dalvikvm(1016):   at android.graphics.Bitmap.createBitmap(Bitmap.java:666)
08-29 23:15:28.850: I/dalvikvm(1016):   at android.graphics.Bitmap.createBitmap(Bitmap.java:633)
08-29 23:15:28.850: I/dalvikvm(1016):   at net.yrom.mat.MainActivity.rock(MainActivity.java:25)
08-29 23:15:28.850: I/dalvikvm(1016):   at java.lang.reflect.Method.invokeNative(Native Method)
08-29 23:15:28.850: I/dalvikvm(1016):   at java.lang.reflect.Method.invoke(Method.java:511)
08-29 23:15:28.850: I/dalvikvm(1016):   at android.view.View$1.onClick(View.java:3593)
08-29 23:15:28.855: I/dalvikvm(1016):   at android.view.View.performClick(View.java:4203)
08-29 23:15:28.855: I/dalvikvm(1016):   at android.view.View$PerformClick.run(View.java:17556)
08-29 23:15:28.855: I/dalvikvm(1016):   at android.os.Handler.handleCallback(Handler.java:725)
08-29 23:15:28.855: I/dalvikvm(1016):   at android.os.Handler.dispatchMessage(Handler.java:92)
08-29 23:15:28.855: I/dalvikvm(1016):   at android.os.Looper.loop(Looper.java:137)
08-29 23:15:28.855: I/dalvikvm(1016):   at android.app.ActivityThread.main(ActivityThread.java:5105)
08-29 23:15:28.855: I/dalvikvm(1016):   at java.lang.reflect.Method.invokeNative(Native Method)
08-29 23:15:28.855: I/dalvikvm(1016):   at java.lang.reflect.Method.invoke(Method.java:511)
08-29 23:15:28.855: I/dalvikvm(1016):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-29 23:15:28.855: I/dalvikvm(1016):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-29 23:15:28.855: I/dalvikvm(1016):   at dalvik.system.NativeStart.main(Native Method)
08-29 23:15:28.855: E/@@@(1016): Got OOM!!!
... ...

此时点击DDMS 上的“Dump HPROF file”

稍等片刻,MAT 自动打开

一览无遗

简述用 MAT 分析 Android 应用OOM相关推荐

  1. OOM分析(1) Android 源,如何分析android的OOM,与java静态代码分析工具

    用MAT分析OOM 很多OOM看似发生在bitmap 分配得时候,但它一般不是rootcause.根本原因都在于本应该自动释放的资源,因为代码的错误,而导致某些对象一直被引用(Reference),例 ...

  2. 如何分析android的OOM,与java静态代码分析工具

    2019独角兽企业重金招聘Python工程师标准>>> 用MAT分析OOM 很多OOM看似发生在bitmap 分配得时候,但它一般不是rootcause.根本原因都在于本应该自动释放 ...

  3. MAT分析android内存泄漏

    转载请标明出处:https://www.cnblogs.com/tangZH/p/10955429.html 泄漏,泄漏,漏~ 内存泄漏怎么破,什么是内存泄漏?与内存溢出有什么区别? 内存泄漏(Mem ...

  4. MAT分析OOM dump文件方法

    系列文章目录 第一章 JVM 排查问题命令汇总 第二章 MAT分析OOM dump文件方法 第三章 Java服务使用CAT监控导致OOM的分析 目录 1.明确分析目标及分析指标 2.分析工具对比(jv ...

  5. Java内存溢出OOM使用Mat分析

    示例 package com.rumenz;import java.util.ArrayList; import java.util.List;public class OutOfMemory {pu ...

  6. ANDROID 探究oom内幕

    从早期G1的192MB RAM开始,到现在动辄1G -2G RAM的设备,为单个App分配的内存从16MB到48MB甚至更多,但OOM从不曾离我们远去.这是因为大部分App中图片内容占据了50%甚至7 ...

  7. android应用内存分析,Android应用程序内存分析-Memory Analysis for Android Applications

    Android应用程序内存分析 原文链接:http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html ...

  8. 什么是java OOM?如何分析及解决oom问题?

    最近查找了很多关于OOM,甚至于Java内存管理以及JVM的相关资料,发现这方面的东西太多了,竟有一种眼花缭乱的感觉,要想了解全面的话,恐非一篇文章能说清的,因此按照自己的理解整理了一篇,剩下的还需要 ...

  9. 使用Memory Analyzer tool(MAT)分析内存泄漏(二)

    前言 在 使用Memory Analyzer tool(MAT)分析内存泄漏(一)中,我介绍了内存泄漏的前因后果.在本文中,将介绍MAT如何根据heap dump分析泄漏根源.由于测试范例可能过于简单 ...

最新文章

  1. 企业如何告别这 5 类不靠谱的员工?
  2. 利用上下文常识,让AI读懂不完整人类指令
  3. 新看了两件家具请朋友们给点意见
  4. matplotlib关于坐标轴数据显示的几个重要参数
  5. 业务服务管理究竟为何可望而不可及
  6. OpenGL 点光源阴影Point Shadows
  7. python多进程打印字符,加锁(Lock加锁)
  8. 多线程-共享全局变量(python版)
  9. 高并发与负载均衡-nginx-反向代理概念
  10. linux系统中make install 时指定安装路径
  11. SCRUM 12.23
  12. https与http的区别
  13. LaTeX 技巧 802:国内期刊 CCT 模板编译经验
  14. 我的PCB设计经验——奥研电子整理
  15. 今日发现一个挺好的软件,控制音量 App音量控制(App Volume Control)v2.17 安卓版
  16. SEO优化中关键词密度和布局的重要性
  17. 2020伊始,电动车又给自己刷了一遍谎言buff
  18. 【91xcz】五方法助你轻松实现win8系统关机操作
  19. Yii框架里的一些zii用法
  20. centos7 如何编译ffmpeg 带x265和nvenc

热门文章

  1. 【错误记录】Kotlin 编译报错 ( Type mismatch: inferred type is String? but String was expected )
  2. 【Android 热修复】热修复原理 ( 类加载机制 | PathClassLoader 加载 Dex 机制 | PathDexList 查找 Class 机制 | 类查找的顺序机制 )
  3. 【计算机网络】应用层 : 网络应用模型 ( 应用层概述 | 客户端 / 服务器 模型 | P2P 模型 )
  4. 【Netty】Netty 核心组件 ( Pipeline | ChannelPipeline )
  5. 【JavaEE WEB 开发】Tomcat 详解 Servlet 入门
  6. 定时器 线程池\进程池
  7. Leetcode 912. Sort an Array
  8. poj2441 Arrange the Bulls
  9. 1063. Set Similarity (25)
  10. 分页浏览的导航栏Bootstrap和js两种方法