[贝聊科技]使用Android Studio和MAT进行内存泄漏分析
1.Java内存分配策略
- 静态存储区(方法区):主要存放静态数据、全局 static 数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在。
- 栈区 :方法体内的局部变量都在栈上创建,并在方法执行结束时这些局部变量所持有的内存将会自动被释放。
- 堆区 : 又称动态内存分配,通常就是指在程序运行时直接 new 出来的内存。这部分内存在不使用时将会由 Java 垃圾回收器来负责回收。
2.堆与栈的区别
public class A {int a = 0;B b = new B();public void test(){int a1 = 1;B b1 = new B();}}A object = new A();复制代码
- A类内的局部变量都存在于栈中,包括基本数据类型a1和引用变量b1,b1指向的B对象实体存在于堆中
- 引用变量object存在于栈中,而object指向的对象实体存在于堆中,包括这个对象的所有成员变量a和b,而引用变量b指向的B类对象实体存在于堆中
3.Java管理内存的机制
4.Java中的内存泄漏
5.Android中常见的内存泄漏
(1)单例造成的内存泄漏
(2)非静态内部类创建静态实例造成的内存泄漏
public class MainActivity extends AppCompatActivity {private static TestResource mResource = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if(mManager == null){mManager = new TestResource();}//...}class TestResource {//...}
}复制代码
非静态内部类默认会持有外部类的引用,而该非静态内部类又创建了一个静态的实例,该实例的生命周期和应用的一样长,这就导致了该静态实例一直会持有该Activity的引用,导致Activity的内存资源不能正常回收。
(3)匿名内部类造成的内存泄漏
如果在Activity/Fragment中使用了匿名类,并被异步线程持有,如果没有任何措施这样一定会导致泄漏。
(4)资源未关闭造成的内存泄漏
(5)一些不良代码造成的内存压力
6.Android中内存泄漏的排查与分析
(1)利用Android Studio的Memory Monitor来检测内存情况
@Overrideprotected void processBiz() {mHandler = new Handler();mHandler.postDelayed(new Runnable() {@Overridepublic void run() {MLog.d("------postDelayed------");}}, 800000L);}复制代码
(2)使用Android Studio生成Java Heap文件来分析内存情况
(3)使用Memory Analyzer(MAT)来分析内存泄漏
MAT支持对标准格式的hprof文件进行内存分析,所以,我们要先在Android Studio里先把Java heap文件转成标准格式的hprof文件,具体步骤如下:
根据我们在Android studio的Java heap文件的提示,TestActivity对象有可能发生了内存泄漏,于是我们直接在上面搜TestActivity(这个搜索功能也是很强大的):
- Group by class
- Group by class loader
- Group by package
references :表示该对象的出节点(被该对象引用的对象)
exclude all phantom/weak/soft etc. references,如下图所示:
3)两个hprof文件的对比
7.总结
最后,还是要再次提醒一下,工具是死的,人是活的,MAT也没有办法保证一定可以将内存泄漏的原因找出来,还是需要我们对程序的代码有足够多的了解,知道有哪些对象是存活的,以及它们存活的原因,然后再结合MAT给出的数据来进行具体的分析,这样才有可能把一些隐藏得很深的问题原因给找出来。
参考资料:
阿里云最近开始发放代金券了,新老用户均可免费获取, 新注册用户可以获得1000元代金券,老用户可以获得270元代金券,建议大家都领取一份,反正是免费领的,说不定以后需要呢? 阿里云代金券 领取 https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=qiziieg4 热门活动 高性能云服务器特惠 助力企业上云 性能级主机2-5折 https://promotion.aliyun.com/ntms/act/enterprise-discount.html?userCode=qiziieg4
[贝聊科技]使用Android Studio和MAT进行内存泄漏分析相关推荐
- [贝聊科技]有关Android应用桌面角标(BadgeNumber)实现的探讨
作者:小强 贝聊移动开发部 Android工程师 前言:本文主要讲述了以下三方面: 怎么在Android系统下让自家的应用图标像iOS系统那样支持数字角标的显示? 在网上找不到现成的解决方案的情况下, ...
- 利用MAT进行内存泄漏分析
##前言 对于程序员来说码代码容易,保证代码的稳定性很难.有时候写完一个功能可能只需要一天时间,但是这个功能隐藏的bug导致的线上问题排查可能需要一周或者更长时间.因此,拥有良好的代码结构和编码规范是 ...
- Android MVP(三)内存泄漏分析与动态代理
博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此 博主:威威喵 | 博客主页:https://blog.csdn.net/ ...
- android profiler 简书,使用AndroidStudio提供的Android Profiler工具和mat进行内存泄漏分析...
废话不多说直接说流程 给项目中集成LeakCanary工具进行内存泄漏检测.发现有内存泄漏后该工具会进行提示 有内存泄露后我们需要使用as的profiler工具进行分析并获取到.hprof文件,步骤如 ...
- 【Android -- 学习笔记】Handler 内存泄漏分析及解决
一.介绍 首先,请浏览下面这段 handler 代码: public class SampleActivity extends Activity {private final Handler mLea ...
- android分析内存工具,Android Studio内存泄漏分析工具汇总
Android Studio内存泄漏分析工具汇总 时间:2017-04-25 来源:Android开发学习网 在Android开发过程中,让人头疼的就是内存泄露问题了,很小的一个错误都会引起内 ...
- Android内存泄漏分析
内存泄漏指的是程序中不再使用的对象对象由于某些原因无法被正常GC回收.对象没 有及时释放,就会占据宝贵的内存空间,因而导致后续分配内存的时候,内存空间不足出现OOM.如果无用对象占据的控件越大,那么可 ...
- [贝聊科技]如何实现一个 AttributedLabel
作者:陈浩 贝聊科技移动开发部 iOS 工程师 Core Text 是苹果提供的富文本排版技术,可以定制开发图文混排功能,DTCoreText.Nimbus.YYLabel 等优秀的开源库底层都是基于 ...
- [贝聊科技]如何将 iOS 项目的编译速度提高5倍
前言 贝聊目前开发的两款App分别是贝聊家长版和贝聊老师版,最近因为在快速迭代开发新功能,项目规模急速增长,单个端业务代码约23万行,私有库约6万行,第三方库代码约15万行,单个客户端的代码行数约60 ...
最新文章
- MySQL-锁表处理
- NGUI 学习笔记实战——制作商城UI界面
- FD.io/VPP — IPSec
- ubuntu 终端批量复制文件_《卡死你3000》批量文件复制命令详解
- Java_io体系之BufferedWriter、BufferedReader简介、走进源码及示例——16
- Linux TC(Traffic Control)框架原理解析
- p1044与p1898
- python标准库怎么用_Python常用标准库使用(一)
- linux 网络劫持编程,Linux下实现劫持系统调用的总结(上)--代码及实现
- PAT乙级(1013 数素数)
- C/C++取数据中高8位,低8位,合成新数据
- 二十一世纪科学和数学的趋势
- win10虚拟机下载安装流程
- 智能机器人需要机器视觉
- 吴伯凡-认知方法论-知行合一的本质
- 深度学习分类问题中accuracy等评价指标的理解
- 经典基础教程---Programming TCP/IP Windows Sockets in C++
- 告诉你60个经典的电脑使用技巧
- 浅谈Selenium之WebUI自动化
- win10打开蓝牙_学会了这些win10快捷键,可以极大的提高你的工作效率