摘抄自:关于内存的几个理论知识
2018-03-05 17:38
246 查看
本文摘自kamidox的Android内存与性能:http://blog.csdn.net/kamidox/article/details/45676429,非常感谢原创作者,如有侵权,请告知删贴!
关于内存的几个理论知识
GC 的工作机制当 GC 工作时,虚拟机停止其他工作。频繁地触发 GC 进行内存回收,会导致系统性能严重下降。内存抖动
在极短的时间内,分配大量的内存,然后又释放它,这种现象就会造成内存抖动。典型地,在 View 控件的 onDraw 方法里分配大量内存,又释放大量内存,这种做法极易引起内存抖动,从而导致性能下降。因为 onDraw 里的大量内存分配和释放会给系统堆空间造成压力,触发 GC 工作去释放更多可用内存,而 GC 工作起来时,又会吃掉宝贵的帧时间 (帧时间是 16ms) ,最终导致性能问题。内存泄漏
Java 语言的内存泄漏概念和 C/C++ 不太一样,在 Java 里是指不正确地引用导致某个对象无法被 GC 释放,从而导致可用内存越来越少。比如,一个图片查看程序,使用一个静态 Map 实例来缓存解码出来的 Bitmap 实例来加快加载进度。这个时候就可能存在内存泄漏。内存泄漏会导致可用内存越来越少,从而导致频繁触发 GC 回收内存,进而导致性能下降。调试工具Memory Monitor Tool: 可以查阅 GC 被触发起来的时间序列,以便观察 GC 是否影响性能。
Allocation Tracker Tool: 从 Android Studio 的这个工具里查看一个函数调用栈里,是否有大量的相同类型的 Object 被分配和释放。如果有,则其可能引起性能问题。
MAT: 这是 Eclipse 的一个插件,也有 stand alone 的工具可以下载使用。
几个原则别在循环里分配内存 (创建新对象)
尽量别在 View 的 onDraw 函数里分配内存
实在无法避免在这些场景里分配内存时,考虑使用对象池 (Object Pool)
两个简单的实例
内存抖动通过一个非常简单的例子来演示内存抖动。这个例子里,在自定义 View 的 onDraw 方法里大量分配内存来演示内存抖动和性能之间的关系。版本一:@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); String msg = ""; for (int i = 0; i < 500; i++) { if (i != 0) { msg += ", "; } msg += Integer.toString(i + 1); } Log.d("DEBUG", msg); }版本二:
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 500; i ++) { if (i != 0) { sb.append(", "); } sb.append(i + 1); } Log.d("DEBUG", sb.toString()); }内存抖动的特征:从 Memory Monitor 来看,有毛刺出现。即短时间内分配大量的内存并触发 GC。
从 Allocation Tracker 里看,一次操作会有大量的内存分配产生。
内存泄漏这个例子里,我们简单地让点击 Settings 菜单,就产生一个 100KB 的内存泄漏。
private void addSomeCache() { // add 100KB cache int key = new Random().nextInt(100); Log.d("sfox", "add cache for key " + key); sCache.put(key, new byte[102400]); }内存泄漏的特征:从 Memory Monitor 来看,内存占用越来越大
利用 MAT 工具进行专业分析。这是个很大的话题。几乎可以独立成几个章节来讲。可以参阅 MAT 本身自带的 Tutorials 来学习。另外,这篇文章里的分析方法是个不错的开始。示例代码使用 Android Studio 开发环境,可以从这里下载。
相关文章推荐
- 0728关于html的几个基础知识点
- 几个关于Java内存泄露方面的问题
- Dom入门(二)--------关于理论知识
- 关于移动端适配的几个方法,快速构建响应式网站必备知识
- 关于DDD领域驱动设计的理论知识收集汇总
- 关于c++检测内存泄露相关知识(windows程序调试)
- 关于DDD领域驱动设计的理论知识收集汇总
- Getmemory的几个经典的关于内存的笔试题
- Caching漫谈--关于Cache的几个理论
- 关于字符串和内存空间的一些知识
- 转:关于指针和内存的几个问题
- 关于java的几个小知识
- 关于领域驱动设计(DDD)的理论知识
- 关于C++的几个小知识
- 关于指针和内存的几个问题
- 关于内存分配的几个原则
- 12-2-22关于内存的一些知识
- 关于C语言程序的内存分配的入门知识学习
- 关于jvm几个关键内存配置参数
- SAR成像基础知识急救箱(零)关于傅里叶变换的几个小困惑