`
wyk86485480
  • 浏览: 29286 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
文章分类
社区版块
存档分类
最新评论

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

阅读更多
用MAT分析OOM
很多OOM看似发生在bitmap 分配得时候,但它一般不是rootcause。根本原因都在于本应该自动释放的资源,因为代码的错误,而导致某些对象一直被引用(Reference),例如 Android 内存优化,如何避免OOM 文章中提到的Activity 的mContext 引用。

当代码量很庞大的时候,单靠读代码查找错误是很困难的,所以必须借助于工具,这里介绍一款很好用的分析工具MAT。

1、下载MAT

http://www.eclipse.org/mat/downloads.php

一般我们的开发环境都选择了Eclipse,所以直接安装插件版的就可以了。

2、使用方法,可以看这篇博文:

http://www.cnblogs.com/Android-and-android/archive/2013/03/05/2943863.html

3、重点理解 Retained Heap、GC Root

http://blog.csdn.net/hhww0101/article/details/8133219

4、如何定位

首 先要知道复现OOM的操作步骤,如果是随机测试出的,也需要找到一个有效的复现步骤才行。然后分别取操作前的 .hprof,和操作后,内存增长后的 .hprof。如果内存不断增长,可取3,4次。然后分别打开 直方图(Histogram)视图,在对象列表中,对比每个对象的 Retained size的变化。

排在第一位的不一定是泄露对象,有可能它本身正常情况就很消耗内存。

泄露的对象是那个突然排名上升的。区分方法是看每个对象的内存地址,地址相同的是同一对象(前提是进程一直运行,没有重启过,重启后内存地址就都变了)。

出 现怀疑对象后,右键 List Objects > with incoming references,可以排除WeakReference 等引用,顺着树节点向下找,如果出现程序中的 Activity,或者某个全局对象,基本就可以确定是它没释放造成的。要更深一步分析为什么没释放,如果逻辑复杂,难于捋清,可以直接做 workaround,想办法释放这个对象就可以了 (set object = null)。

java静态代码分析工具
写代码过程中难免会有疏漏,我们也可以借助工具分析,这里是常用的java静态代码分析工具:

http://www.oschina.net/question/129540_23043

个人觉得Find Bugs 和 PMD就可以了,只是辅助,不必过分依赖,他并不是万能的,不是所有错误都能找出来。

欢迎转载:http://www.yinqisen.cn/blog-315.html
分享到:
评论

相关推荐

    Android内存OOM优化详解.pdf

    要查看Android设备对App的内存限制,可以通过adb命令行工具查看 `/system/build.prop` 文件,或者在代码中利用`ActivityManager`的`getMemoryClass()`方法。另外,虽然可以尝试修改源代码如`AndroidRuntime.cpp`或`...

    安卓内存OOM分析

    1. **内存分析工具**:如MAT(Memory Analyzer Tool)、LeakCanary等,可以帮助我们定位内存泄露的对象和引用链。 2. **Hprof文件分析**:通过dump hprof文件,可以获取到内存快照,进一步分析内存分配和引用关系。 ...

    android内存分析工具

    MAT是IBM提供的一款强大的Java内存分析工具,它不仅适用于Android开发,也适用于任何基于Java的平台。MAT能够帮助开发者深入理解内存分配情况,检测内存泄漏和不必要的对象引用,从而有效地优化内存使用,防止OOM的...

    android防止oom的图片加载例子

    下面将详细介绍如何在Android中防止OOM错误,并通过`BitmapTool`工具类的使用,提供一种解决方案。 1. **理解Android内存管理** - Android为每个应用分配了一定的堆内存,不同设备和API级别有所不同。 - 当应用...

    Android史上最全工具类

    总的来说,"Android史上最全工具类"这个资源对于Android开发者来说是极其宝贵的,它不仅节省了开发者的时间,也使得代码更加整洁和规范。无论你是初学者还是经验丰富的开发者,这个压缩包都值得下载和学习,以提升你...

    Android快速开发系列 10个常用工具类 程序源码

    在Android应用开发中,工具类(Utils)是程序员经常使用的辅助模块,它们包含了一系列静态方法,用于处理各种常见的任务,从而提高代码的复用性和可维护性。本资源"Android快速开发系列 10个常用工具类 程序源码...

    Android代码-whatsmars

    【Android代码-whatsmars】项目是一个专门为Android开发者提供的开源库,它包含了一系列实用的工具类和组件,旨在简化Android开发工作,提高开发效率。通过对whatsmars-master压缩包的分析,我们可以深入理解Android...

    图片三级缓存,防止OOM

    3. **PMD**:PMD也是静态代码分析工具,能找出可能的问题,如冗余代码、未使用的变量、复杂的表达式等,有助于提高代码质量和可维护性。 四、MyAndroidImageCacheDemo项目 这个项目的名称暗示它是一个Android图片...

    常用android工具类收集

    13. **GsonUtils**:基于Gson库的工具类,提供了JSON数据与Java对象之间的转换,使得数据序列化和反序列化更加方便。 AndroidUtilCode项目不仅提供了这些工具类,还包含了其他如权限检查、颜色转换、设备信息获取等...

    android常用的工具类

    在Android开发过程中,工具类(Utility Classes)是开发者不可或缺的辅助工具。它们通常包含一系列静态方法,用于执行特定任务,如处理字符串、日期、网络请求等。这些工具类提高了代码的可重用性和模块化,使得开发...

    android开发技巧与性能优化

    综上所述,Android开发不仅要求开发者具备扎实的Java编程基础,还需要深入了解Android平台的特性与最佳实践。通过运用上述技巧和方法,可以在保证应用功能完备的同时,显著提升用户体验。希望本文能为广大Android...

    Android、Java 面试突破专题(无参考答案).docx

    在Android和Java的面试中,掌握关键知识点是至关重要的。以下是一些基于给定内容的详细解释: **Android基础知识与底层机制** 1. **数据库操作**:Android中主要使用SQLite数据库,操作包括创建、查询、更新、删除...

    android 工具类

    在Android开发中,工具类(Util)是一种封装常用功能的静态类,它们提供了一系列静态方法,使得开发者在处理特定任务时能快速调用,而无需每次都编写相同的代码。以下是对标题和描述中涉及的一些关键知识点的详细...

    Android App定位和规避内存泄露方法研究

    2. 使用Eclipse Memory Analyzer Tool (MAT):MAT是一个强大的内存分析工具,适用于Java层的内存泄露分析。它可以帮助开发者识别内存中大量占用的实例,定位出内存泄露的源头。 规避内存泄露的方法主要包括: 1. ...

    android内存泄露测试

    - **ProGuard**:一个代码混淆和优化工具,也可以用来检查内存泄漏,尤其是在代码混淆后。 #### 二、MAT的安装与使用 1. **安装MAT**: - 打开Eclipse,选择`Help -> Install New Software...` - 在`Work with:`...

    http://elinux.org/Android_Memory_Usage

    3. **内存泄漏**:什么是内存泄漏,如何通过分析工具检测内存泄漏,以及如何避免它们,包括避免静态变量引用导致的泄漏,及时关闭Cursor,解除对View的引用等。 4. **内存溢出**:分析OOM(Out of Memory)错误,...

    Android常用的工具类

    在Android开发过程中,工具类(Utility Class)是程序员经常使用的一种设计模式,它们通常包含一组静态方法,用于执行特定的任务或者提供便捷的功能。这些工具类可以极大地提高代码的复用性和可维护性。以下是一些...

    仿uber启动动画,解决帧动画oom

    首先,帧动画是Android中一种常见的动画形式,它通过连续播放一系列静态图像来形成动态效果。在`res/anim`目录下创建一个`animation.xml`文件,定义帧动画序列。每一帧可以是一个`<item>`标签,其中`drawable`属性...

    应用源码之防止内存溢出浅析.zip

    12. **Android内存分析**:学习如何使用MAT (Memory Analyzer Tool) 或其他第三方工具进行更深度的内存分析,识别内存增长的主要原因。 13. **多进程策略**:在必要时,可以采用多进程策略来隔离内存,防止一个进程...

    java代码-bitmap图片

    在Java编程环境中,Bitmap图片处理是一项常见的任务,特别是在Android应用开发中。Bitmap是Android系统中的一个类,用于表示图像数据,它可以用来加载、显示、编辑和保存图片。在这个主题中,我们将深入探讨如何使用...

Global site tag (gtag.js) - Google Analytics