`
su1216
  • 浏览: 671926 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
深入入门正则表达式(jav...
浏览量:71997
E60283d7-4822-3dfb-9de4-f2377e30189c
android手机的安全问...
浏览量:128907
社区版块
存档分类
最新评论

android OutOfMemory时抓取heap快照

阅读更多

(这里不教你如何分析heap快照,只说明如何在关键时候抓取)

首先说一下,在程序没有崩溃的时候如何抓取heap快照。

这个大家应该都知道,在ddms中自带此功能。

见上图

首先我们选中一个进程,然后点击 Update Heap按钮(小绿虫子旁边的按钮),这时就能看到heap使用情况

如果想取出快照详细分析,我们可以点击 Dump HPROF File按钮,保存到电脑上面。使用android-sdk/tools/hprof-conv这个工具把文件转换一下,之后用MAT分析即可。

hprof-conv '/home/su1216/data.hprof' '/home/su1216/data_ok.hprof'

这时MAT能直接打开data_ok.hprof文件。

 

 

如果想要OOM时的内存快照该怎么办,我们总不能紧盯着手机的同时再盯着电脑,OOM出现的瞬间抓取内存快照,这显然是不现实的。

如果OOM并不经常复现,那么我们会错过很多修改bug的机会,浪费很多时间。

 

下面给大家一种抓取OOM时的heap快照的方法

由于OOM时的heap快照较大,所以抓取的内存快照我选择保存到sd卡中,因此要有写入外部存储的权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

然后我们需要实现UncaughtExceptionHandler这个接口

记得要设置未捕获异常的Handler,设置为自己。

当出现了异常的时候,uncaughtException方法会被调用,所以如果我们可以在这里抓取内存快照。

import java.lang.Thread.UncaughtExceptionHandler;

import android.os.Debug;
import android.os.Environment;
import android.util.Log;

public class CrashHandler implements UncaughtExceptionHandler {

	public static final String TAG = "CrashHandler";
	private Thread.UncaughtExceptionHandler mDefaultHandler;
	private static final String OOM = "java.lang.OutOfMemoryError";
	private static final String HPROF_FILE_PATH = Environment.getExternalStorageDirectory().getPath() + "/data.hprof";

	private static CrashHandler sCrashHandler;

	private CrashHandler() {}

	public synchronized static CrashHandler getInstance() {
		if (sCrashHandler == null) {
			sCrashHandler = new CrashHandler();
		}
		return sCrashHandler;
	}

	public void init() {
		mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
		Thread.setDefaultUncaughtExceptionHandler(this);
	}

	public static boolean isOOM(Throwable throwable){
		Log.d(TAG, "getName:" + throwable.getClass().getName());
		if(OOM.equals(throwable.getClass().getName())){
			return true;
		}else{
			Throwable cause = throwable.getCause();
			if(cause != null){
				return isOOM(cause);
			}
			return false;
		}
	}
	
	public void uncaughtException(Thread thread, Throwable throwable) {
		if(isOOM(throwable)){
			try {
				Debug.dumpHprofData(HPROF_FILE_PATH);
			} catch (Exception e) {
				Log.e(TAG, "couldn’t dump hprof", e);
			}
		}

		if (mDefaultHandler != null) {
			mDefaultHandler.uncaughtException(thread, throwable);
		} else {
			android.os.Process.killProcess(android.os.Process.myPid());
			System.exit(1);
		}
	}
}

最关键的代码是这句

 

Debug.dumpHprofData(HPROF_FILE_PATH);

 

使得我们可以自己控制抓取heap快照的时机

OutOfMemoryError是系统级别的错误,所以一般情况下不该捕获它。

万一有人捕获了,并且重新抛出了一个调用了initCause方法的异常,我们也应该截获它,然后修正bug,而不是掩藏它。

 

我们在这里只是需要抓取内存快照,干完活之后要记得把throwable交给系统来处理

mDefaultHandler.uncaughtException(thread, throwable);

当然,我们在这个地方实际上也可以屏蔽掉force close对话框,很神奇吧。。。

 

结尾顺便说一下,如何查看android对应用的内存限制

每款手机对应用的限制都是不一样的,毕竟硬件不同,我们可以使用如下方式来查看单独的应用可使用的最大内存:

adb shell getprop | grep heap
[dalvik.vm.heapgrowthlimit]: [64m]
[dalvik.vm.heapsize]: [256m]
[dalvik.vm.heapstartsize]: [8m]

输入命令之后回查到上述几个结果

[dalvik.vm.heapstartsize]: [8m]:给进程分配的起始heap=8m

[dalvik.vm.heapgrowthlimit]: [64m]:进程最大可分配到64m

[dalvik.vm.heapsize]: [256m]:单个虚拟机可分配的最大内存=256m

 

更改上述参数可以在build.prop修改

build.prop在system下,pull出来修改后再push回去,reboot即可

 

 

我们可以根据这个来估计heap的大小,检查sd卡剩余空间是否够用。

 

 

转贴请保留以下链接

本人blog地址

http://su1216.iteye.com/

http://blog.csdn.net/su1216/

  • 大小: 644 Bytes
  • 大小: 525 Bytes
2
3
分享到:
评论
1 楼 i5suoi 2012-10-24  
thank you very much

相关推荐

    tomcat out of memory

    标题 "Tomcat Out of Memory" 指的是在运行Apache Tomcat服务器时遇到的一种常见问题,即内存溢出。这通常发生在Tomcat处理大量请求、加载过多应用或资源,或者配置不当导致内存分配不足时。当Java虚拟机(JVM)无法...

    BlazeDS+Spring+activeMQ outofmemory

    标题 "BlazeDS+Spring+activeMQ outofmemory" 指的是在使用BlazeDS、Spring和ActiveMQ集成的环境中遇到了内存溢出问题。BlazeDS是一个开放源码的服务器端技术,它允许双向通信,使Flex或AJAX客户端能够与Java后端...

    vue项目build打包时报错 “JavaScript heap out of memory” 的解决办法

    当前端项目非常庞大时,编译时会占用很多资源,所以就会出现内存溢出的问题。 以下是我的问题解决方法 cd到我们的项目目录下执行 // windows set NODE_OPTIONS=--max_old_space_size=4096 // mac/linux export NODE_...

    编译时出现java.lang.OutOfMemoryError Java heap space异常

    ### 编译时出现java.lang.OutOfMemoryError Java heap space异常 #### 一、问题概述 在进行Java项目编译的过程中,可能会遇到`java.lang.OutOfMemoryError: Java heap space`这种异常。这类异常通常表明Java虚拟机...

    OutOfMemory的一个解决方法

    这个错误可以分为几种类型,包括`PermGen space`、`Heap Space`、`Metaspace`等,分别对应不同的内存区域。 #### 问题场景与原因分析 在特定的应用场景下,例如将大量数据(如3MB)存储到数据库之后执行其他操作时...

    tomcat out of memory solution

    标题与描述中的关键词“Tomcat Out of Memory Solution”指向了在运行Tomcat服务器时遇到内存溢出错误(Out of Memory Error)的解决方法。在IT领域,尤其是Java应用服务器环境中,Tomcat作为一款广泛使用的开源轻量...

    mysql Out of memory (Needed 16777224 bytes)的错误解决

    MySQL数据库在运行过程中可能会遇到“Out of memory (Needed 16777224 bytes)”的错误,这通常表示数据库服务器在执行某查询时内存不足。该问题可能由多种因素引起,包括查询缓存设置、内存分配限制以及存储过程中的...

    mysqld-nt: Out of memory (Needed 1677720 bytes)解决方法

    MySQL数据库在运行过程中遇到“mysqld-nt: Out of memory (Needed 1677720 bytes)”错误,通常表示服务器在处理查询时内存不足。这个问题可能由多种因素引起,包括不当的配置参数、内存限制以及系统架构。以下是一些...

    Android设备挂机dump日志抓取脚本bat

    使用bat脚本编写,简单,点击就能用 不要安装各种软件环境

    elasticdump报错

    FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 1: node::Abort() [node] 2: 0x8cd49c [node] 3: v8::Utils::ReportOOMFailure(char const*, bool) [node] 4: v8::...

    HBuilderX uniapp打包内存溢出解决放案.zip

    uniapp项目体量过大时,打包H5会报错, - process out of memory 解决放案: 替换HBuildX内置\HBuilderX\plugins\node\node.exe版本 添加\HBuilderX\plugins\compile-node-sass\node_modules\node-sass-china\...

    Android-OOM.rar_memory android_memory for Android_out

    在Android开发过程中,"Out Of Memory"(OOM)错误是一个常见的问题,特别是在处理大量数据、图像或者长时间运行的任务时。这个错误表示应用程序消耗了过多的内存,超过了系统分配的限制,导致系统无法再为该应用...

    Android hprof 自动化dump heap脚本:djheap.sh

    Android hprof 自动化dump heap脚本 MAC 上执行脚本: pid 为 app 的进程 id sh ./djheap.sh [packageName] [pid] 导出 hprof 文件可以用 mat 工具进行分析

    native_heapdump_viewer.py

    1.打开Android调试开关(需要userdebug版本) setenforce 0 setprop libc.debug.malloc 1 setprop libc.debug.malloc.options backtrace stop;start 2.获取进程pdi ps -ef | grep "app or service" 3.抓取步骤2进程的...

    Linux_Android_内核_Heap_Spray_的几种姿势.pdf

    Linux和Android内核的Heap Spray技术是一种常见的攻击技术,它主要利用了内存管理中的一些漏洞,通过在内存中喷射大量的数据,来覆盖特定的内存地址,从而达到获取系统权限等目的。 首先,我们需要对Linux和Android...

    java 内存溢出分析工具 HeapAnalyzer

    Java内存溢出(Out of Memory,OOM)是Java应用程序中常见的问题,会导致程序崩溃或性能急剧下降。HeapAnalyzer是一款强大的工具,专为分析Java应用程序的内存状况,特别是针对内存溢出问题进行诊断。本文将详细介绍...

    IBM官方文档,websphere 内存泄漏分析步骤和工具使用

    1. **理解导致OutOfMemory条件的原因** 2. **使用Tivoli Performance Viewer检测内存溢出状况** 3. **获取详细的垃圾收集(GC)日志** 4. **获取Java堆内存快照(Heap Dump)** 5. **解读详细的垃圾收集日志** 6. **...

    Java Heap Cleaner:简单的函数清理,在运行时,Java堆内存,从而防止java OutOfMemory错误-matlab开发

    Java Heap Cleaner 是 Java 类的 MATLAB 包装器,可清除 Java 堆内存泄漏,防止臭名昭著的 Java OutOfMemory 异常。 Java 代码重新初始化一些负责内存泄漏的 JVM 类,然后强制进行垃圾回收。 重新初始化的 Java 类...

Global site tag (gtag.js) - Google Analytics