随笔分类 -  Android 性能优化之内存优化

摘要:WebView造成内存泄露 关于WebView的内存泄露,因为WebView在加载网页后会长期占用内存而不能被释放,因此我们在Activity销毁后要调用它的destory()方法来销毁它以释放内存。 另外在查阅WebView内存泄露相关资料时看到这种情况: Webview下面的Callback持有 阅读全文
posted @ 2018-02-26 17:03 一点点征服 阅读(907) 评论(0) 推荐(0)
摘要:资源未关闭或释放导致内存泄露 在使用IO、File流或者Sqlite、Cursor等资源时要及时关闭。这些资源在进行读写操作时通常都使用了缓冲,如果及时不关闭,这些缓冲对象就会一直被占用而得不到释放,以致发生内存泄露。因此我们在不需要使用它们的时候就及时关闭,以便缓冲能及时得到释放,从而避免内存泄露 阅读全文
posted @ 2018-02-26 15:47 一点点征服 阅读(390) 评论(0) 推荐(0)
摘要:android 中有很多注册和反注册,由于在注册后,上下文自身会被持久化的观察者列表所持有,如果不进行反注册,就会造成内存泄漏 内存泄漏1:Sensor Manager 代码如下: MainActivity.java 为什么? 通过Context调用getSystemService获取系统服务,这些 阅读全文
posted @ 2018-02-26 15:22 一点点征服 阅读(986) 评论(0) 推荐(0)
摘要:线程持久化 Java中的Thread有一个特点就是她们都是直接被GC Root所引用,也就是说Dalvik虚拟机对所有被激活状态的线程都是持有强引用,导致GC永远都无法回收掉这些线程对象,除非线程被手动停止并置为null或者用户直接kill进程操作。所以当使用线程时,一定要考虑在Activity退出 阅读全文
posted @ 2018-02-26 15:13 一点点征服 阅读(1387) 评论(0) 推荐(1)
摘要:1,内存泄漏到本质是该释放的对象被持久化的对象引用了,造成持久化的常见情况有1,静态持久化 2,线程持久化 线程持久化 因为存活的线程是有dvk虚拟久直接持有,所以存活的线程都是持久化的 内存泄漏1:静态Activities(static Activities) 代码如下: MainActivity 阅读全文
posted @ 2018-02-26 14:09 一点点征服 阅读(1644) 评论(0) 推荐(0)
摘要:在Android性能优化第(一)篇 基本概念中讲了JAVA的四大引用,讲了一下GCRoot,第二篇Memory Monitor检测内存泄露仅仅说了Menmery Monitor的使用,这篇博客谈一下MAT来寻找内存泄露,相对来说,Memory Monitor没有MAT强大,但是在开始介绍MAT之前, 阅读全文
posted @ 2018-02-26 13:39 一点点征服 阅读(820) 评论(0) 推荐(0)
摘要:之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用。直到今天终于发现了这个新工具: 当我们的App中存在内存泄露时会在通知栏弹出通知: 当点击该通知时,会跳转到具体的页面,展示出Leak的引用路径,如下图所示: LeakCanary 可以用更加直白的方式将内存泄露展 阅读全文
posted @ 2018-02-26 13:29 一点点征服 阅读(371) 评论(0) 推荐(0)
摘要:上篇说了一些性能优化的理论部分,主要是回顾一下,有了理论,小平同志又讲了,实践是检验真理的唯一标准,对于内存泄露的问题,现在通过Android Studio自带工具Memory Monitor 检测出来。性能优化的重要性不需要在强调,但是要强调一下,我并不是一个老司机,嘿嘿!没用过这个工具的,请睁大 阅读全文
posted @ 2018-02-26 11:19 一点点征服 阅读(588) 评论(0) 推荐(0)
摘要:1, Dalvik & ART Android在4.4之前一直使用的Dalvik虚拟机作为App的运行VM的, 4.4中引入了ART作为开发者备选, 5.0起正式将ART作为默认VM了. 我们首先来简单了解下二者: 1.1 Dalvik 如果只是想简单了解, 个人觉得百度百科上这个Dalvik的介绍 阅读全文
posted @ 2018-02-26 11:16 一点点征服 阅读(581) 评论(0) 推荐(0)
摘要:引言 接App优化之内存优化(序), 作为App优化系列中内存优化的一个小部分. 由于内存相关知识比较生涩, 内存优化中使用到的相关工具, 也有很多专有名词. 对Java内存管理, GC, Android内存管理, Dalvik/ART等知识有一个理论的认识, 可以让我们更好的使用这些工具, 分析内 阅读全文
posted @ 2018-02-25 17:13 一点点征服 阅读(1379) 评论(0) 推荐(0)
摘要:1. finalize的作用 finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。 finalize()与C++中的析构函数不是对应的。C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的f 阅读全文
posted @ 2018-02-25 17:11 一点点征服 阅读(487) 评论(0) 推荐(0)
摘要:开篇废话 如果我们想要进行内存优化的工作,还是需要了解一下,但这一块的知识属于纯理论的,有可能看起来会有点枯燥,我尽量把这一篇的内容按照一定的逻辑来走一遍。首先,我们为什么要学习垃圾回收的机制,我大概归纳了一下几点: 1.方便我们理解什么样的对象,什么时候,会被系统回收掉 2.有助于我们后面的内存优 阅读全文
posted @ 2018-02-25 17:10 一点点征服 阅读(344) 评论(0) 推荐(0)
摘要:JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区。 下面对这五个区域展开深入的介绍。 1. 程序计数器 1.1. 什么是程序计数器? 程序计数器是一块 阅读全文
posted @ 2018-02-25 17:08 一点点征服 阅读(417) 评论(0) 推荐(0)
摘要:开篇废话 今天我们一起来学习JVM的内存分配,主要目的是为我们Android内存优化打下基础。 一直在想以什么样的方式来呈现这个知识点才能让我们易于理解,最终决定使用方法为:图解+源代码分析。 欢迎访问我的个人博客:senduo's blog 希望能在我们平时开发写代码的时候,能够知道当前写的这段代 阅读全文
posted @ 2018-02-25 17:07 一点点征服 阅读(1090) 评论(0) 推荐(0)