简述用 MAT 分析 Android 应用OOM
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 应用的内存泄露。
- 首先安装 MAT
在http://www.eclipse.org/mat/downloads.php下载或者用Update Sitehttp://download.eclipse.org/mat/1.4/update-site/安装 - 在 DDMS 中选择需要调试的设备及你的应用进程
- 点击“Dump HPROF file”按钮提取 dump 文件(需稍许等待)
- 自动用MAT 打开文件,选择“Leak Suspects Report”
- 睁大你的双眼揪出最有可能导致 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 |
|
布局中只有一个按钮,点击后即执行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相关推荐
- OOM分析(1) Android 源,如何分析android的OOM,与java静态代码分析工具
用MAT分析OOM 很多OOM看似发生在bitmap 分配得时候,但它一般不是rootcause.根本原因都在于本应该自动释放的资源,因为代码的错误,而导致某些对象一直被引用(Reference),例 ...
- 如何分析android的OOM,与java静态代码分析工具
2019独角兽企业重金招聘Python工程师标准>>> 用MAT分析OOM 很多OOM看似发生在bitmap 分配得时候,但它一般不是rootcause.根本原因都在于本应该自动释放 ...
- MAT分析android内存泄漏
转载请标明出处:https://www.cnblogs.com/tangZH/p/10955429.html 泄漏,泄漏,漏~ 内存泄漏怎么破,什么是内存泄漏?与内存溢出有什么区别? 内存泄漏(Mem ...
- MAT分析OOM dump文件方法
系列文章目录 第一章 JVM 排查问题命令汇总 第二章 MAT分析OOM dump文件方法 第三章 Java服务使用CAT监控导致OOM的分析 目录 1.明确分析目标及分析指标 2.分析工具对比(jv ...
- Java内存溢出OOM使用Mat分析
示例 package com.rumenz;import java.util.ArrayList; import java.util.List;public class OutOfMemory {pu ...
- ANDROID 探究oom内幕
从早期G1的192MB RAM开始,到现在动辄1G -2G RAM的设备,为单个App分配的内存从16MB到48MB甚至更多,但OOM从不曾离我们远去.这是因为大部分App中图片内容占据了50%甚至7 ...
- android应用内存分析,Android应用程序内存分析-Memory Analysis for Android Applications
Android应用程序内存分析 原文链接:http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html ...
- 什么是java OOM?如何分析及解决oom问题?
最近查找了很多关于OOM,甚至于Java内存管理以及JVM的相关资料,发现这方面的东西太多了,竟有一种眼花缭乱的感觉,要想了解全面的话,恐非一篇文章能说清的,因此按照自己的理解整理了一篇,剩下的还需要 ...
- 使用Memory Analyzer tool(MAT)分析内存泄漏(二)
前言 在 使用Memory Analyzer tool(MAT)分析内存泄漏(一)中,我介绍了内存泄漏的前因后果.在本文中,将介绍MAT如何根据heap dump分析泄漏根源.由于测试范例可能过于简单 ...
最新文章
- 企业如何告别这 5 类不靠谱的员工?
- 利用上下文常识,让AI读懂不完整人类指令
- 新看了两件家具请朋友们给点意见
- matplotlib关于坐标轴数据显示的几个重要参数
- 业务服务管理究竟为何可望而不可及
- OpenGL 点光源阴影Point Shadows
- python多进程打印字符,加锁(Lock加锁)
- 多线程-共享全局变量(python版)
- 高并发与负载均衡-nginx-反向代理概念
- linux系统中make install 时指定安装路径
- SCRUM 12.23
- https与http的区别
- LaTeX 技巧 802:国内期刊 CCT 模板编译经验
- 我的PCB设计经验——奥研电子整理
- 今日发现一个挺好的软件,控制音量 App音量控制(App Volume Control)v2.17 安卓版
- SEO优化中关键词密度和布局的重要性
- 2020伊始,电动车又给自己刷了一遍谎言buff
- 【91xcz】五方法助你轻松实现win8系统关机操作
- Yii框架里的一些zii用法
- centos7 如何编译ffmpeg 带x265和nvenc
热门文章
- 【错误记录】Kotlin 编译报错 ( Type mismatch: inferred type is String? but String was expected )
- 【Android 热修复】热修复原理 ( 类加载机制 | PathClassLoader 加载 Dex 机制 | PathDexList 查找 Class 机制 | 类查找的顺序机制 )
- 【计算机网络】应用层 : 网络应用模型 ( 应用层概述 | 客户端 / 服务器 模型 | P2P 模型 )
- 【Netty】Netty 核心组件 ( Pipeline | ChannelPipeline )
- 【JavaEE WEB 开发】Tomcat 详解 Servlet 入门
- 定时器 线程池\进程池
- Leetcode 912. Sort an Array
- poj2441 Arrange the Bulls
- 1063. Set Similarity (25)
- 分页浏览的导航栏Bootstrap和js两种方法