Android内存与特性优化找个正规网赌平台

法定教程

  1. Android
    Performance

    是 GOOGLE 近来揭橥在 Udacity 上的合法教程
    不便利科学上网的同班可以从自我的百度网盘里下载。
  2. Android Performance
    Patterns

    是 GOOGLE 在 2015 年底公告在 Facebook 上的专题课程
    那有的内容
    CDGChina
    加了中文字幕,并放在
    Youku
    上了。

!!! notes
因此看来 Android 生态圈的特性和电量消耗等题材,已经严重到让 谷歌(Google)不得不强调的地步啦 ~~

关于内存的多少个理论知识

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。

找个正规网赌平台 1

memory_churn

从 Allocation Tracker 里看,四遍操作会有雅量的内存分配暴发。

找个正规网赌平台 2

memory_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 来看,内存占用越来越大

找个正规网赌平台 3

memory_tracker

利用
MAT
工具举办规范分析。那是个很大的话题。大概可以单独成多少个章节来讲。能够参考
MAT 本身自带的 Tutorials
来学学。其余,那篇文章里的分析方法是个不利的早先。

示范代码应用 Android Studio
开发条件,可以从这里下载。

选用 MAT 分析内存难点

内存泄漏

一个卓越的标题是 Android
系统越用越慢。那种典型地是由内存泄漏引起的。一个很有用的解决那种难题的章程是:相比较前后五个级次的内存的使用状态。一般流程如下:

  1. 利用 ddms 工具 dump HPROF file
  2. 拔取 hprof-conv 把 dalvik 格式的转移为普通 jvm 格式
  3. 重新步骤 1 和 2 抓出两份 LOG。
  4. 使用 MAT 对两份 HRPOF 文件举办辨析,结合代码找出可能存在的内存泄漏

譬如说针对拨号盘越来越慢的题材,大家得以开机后启动拨号盘,打进打出10个电话。然后抓个
HPROF 文件。接着,再打进打出10个电话,再抓一个 HPROF
文件。接着拿那多个文本相比较分析,看是还是不是会招致电话打进打出越多,内存占用更多的情形爆发。

!!! notes “HPROF文件”
HPROF 容易地精晓,就是从 jvm 里 dump 出来的内存和 CPU
使用景况的一个二进制文件。它的英文全名叫 A Heap/CPU Profiling
Tool。这里有它完整的法定文档和它的历史介绍。

开拓 MAT 后,会有一个 Tutorials
来教大家怎么用。那里列出多少个操作步骤及其注意事项。

  • 在 DDMS 里导出 HPROF 文件前,最好手动执行一下
    GC。目标是让导出的内存整体是被引用的。否则在做内存占用比较时,会有过多不要求的内存占用被标识出来,干扰大家进行辨析。
  • 开展自查自纠时,最好是挑选操作较多的和操作较少的比较,那样得出的 delta
    是正数
  • 经过对照,发现内存泄漏时,可以用 OQL 来查询,并透过 Root to GC
    成效来找到发生败露的源代码

在大家的示范程序里面,每一遍点击 Settings
菜单,都会招致一遍100KB的内存泄漏。下边是我们采纳方面介绍的流程来搜寻内存泄漏难点。我们先点击
5 次 Settings 菜单,然后手动触发两次 GC,再导出 HPROF
文件。接着,大家再点击 6 次 Settings 菜单,然后手动触发一回GC,再导出第二份 HPROF 文件。大家拿那两份 HPROF 就能够做一些比照。

找个正规网赌平台 4

mat_diff.png

通过上图可以看来,三次操作确实致使了某些类的实例扩张了。图中得以知晓地看看
byte[] 和 java.util.HashMap$HashMapEntry
多个类增添得比较领悟。那样,大家不管采用一个,通过 OQL
来查询系统中的这几个内存。

找个正规网赌平台 5

mat_qql.png

从上图可以找到,这次 dump
出来的内存里,确实有为数不少个这一个类的实例。在图上右击任何一个实例,右击,拔取
Paths to GC roots,可以找到这些实例是被何人引用的。

找个正规网赌平台 6

mat_gc_root.png

从上图可以看出来,那个内存是被 MainActivity 里的 sCache
引用的。通过阅读代码,大家就足以找到这么些漏洞了。即每一遍都往 sCache
里保存一个引用。

总结

谷歌录像介绍的情节是硬知识,精通这几个文化可以协理我们写出高质料,高性能的代码。而
MAT, HPROF, Memory Monitor, Allocation Tracker
提供了一个“破案”的工具给咱们。我们采用那一个工具,倒回来去发现代码里的题材。

拉开阅读

至于 Android 性能优化,网络上有几篇相比好的小说,基本根据 GOOGLE
的法定教程翻译过来的,质量比较高。可以参考一下。

  1. Android
    性能优化内存篇
    胡凯的博客
  2. Android性能优化典范胡凯的博客

冷知识

GC 是在 1959 年由 约翰 麦卡锡 发明的,此表达是为领悟决 Lisp
编程语言里的内存难点的。《黑客和艺术家》小编,硅谷最有影响力的孵化器集团YC 创制者 Paul 格兰汉 高度评价 Lisp
语言,认为编程语言发展到明日,依然没有跳出 Lisp 语言在上世纪 60
年代所提倡的那个理念。并且,他还把温馨那时创业,完成财务自由的品种
Viaweb 的打响归功于 Lisp 语言。详细可观看 Paul 格雷汉姆的那篇博客那篇博客

Leave a Comment.