另外特别值得一提的凡,书中还有大量底针对性首都民俗知识之描摹,例如北京底婚礼,钟鼓楼的史,荷花市场等等穿插书中,引人入胜,阅读时起之那种历史感是十分稀奇古怪的。

至于内存的几乎单理论知识

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)

     
 本书有大气底人物描写,尤其针对人心理细腻而生动地写不禁让我以翻阅时暗惊叹与赞佩。每一个人选之性情都享有风味,虽然她们是重常见不了的城池居民,但他俩的数,他们之思维,甚至他们之败笔和陋习在作者的迪下,引领在读者出一个并且一个题材,为什么他们见面如此?为什么像他们之丁见面如此?我们的社会怎么发生这般的思绪或风气?从一个人出发,到具有部分雷同品质之群体,再到全方位社会这吸引思考,并循循善诱给起答案。从这角度也同时有关联,书被是这么说正“在同样之流年前,不同的丁却下在不同之情态来消耗它,因而形成不同的感想”,就如笔者所说之那么,时间针对私家来说是命运,对全体社会来说即使是历史。

运 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 就足以开片对照。

科学 1

mat_diff.png

透过达成图可以见见,两涂鸦操作确实造成了好几类的实例增加了。图中好知晓地察看
byte[] 和 java.util.HashMap$HashMapEntry
两独八九不离十增加得比明白。这样,我们无挑一个,通过 OQL
来询问网遭到的这个内存。

科学 2

mat_qql.png

于上图可以找到,本次 dump
出来的内存里,确实来为数不少个之看似的实例。在祈求及右击任何一个实例,右击,选择
Paths to GC roots,可以找到这个实例是吃谁引用的。

科学 3

mat_gc_root.png

从今上图可以扣押下,这个内存是叫 MainActivity 里之 sCache
引用的。通过阅读代码,我们即便可找到这漏洞了。即每次都往 sCache
里保存一个引用。

     
 我本身于念这仍开常常,真的是恨铁不成钢,因为还以心智成长的等级,对活,对两样之人口的心性有大批之疑惑和茫然,作者在养人物之还要,也诠释了各种各样的人物性格形成的缘由。作者不就就因为上帝视角去分析他们,并为同样栽达观平和之情态去劝导读者了解他们,关怀他们。在读书在题被各具色彩的人选时,会突然发现似乎以好之现实生活中未纵有在这么的人耶,而协调的森心情不为是同中间同样个人物一致啊。再趁作者慢慢分析与解读,会生出成百上千实际的获,心态及之别,这是自身一样开始没想到的。

官方教程

  1. Android
    Performance
    是 GOOGLE 近期披露于 Udacity 上之法定教程
    切莫便民是上网的同学可以起自家的百度网盘里下载。
  2. Android Performance
    Patterns
    是 GOOGLE 在 2015 新春宣告于 Facebook 上的专题课程
    马上有情节
    CDGChina
    加了中文字幕,并放在
    Youku
    上了。

!!! notes
总的看 Android 生态圈的习性与电量消耗相当于题材,已经重到于 Google
不得不重视的境界啦 ~~

       
在挥洒被,时间是有些不着边际的辞藻遍布了整治本书。书之目中的各国一样卷便是一律天的实际时间点(例如卯,辰,已等等)。每卷中各个小节的问题大幽默,乍一禁闭让人同一栽前言不搭后语的感觉到,一读变能够掌握里面妙趣。此外,时间持续于每个人物之思量要回忆中,以此同时勾描除了世纪间都习以为常市民之在情景,不只有只是局限为当时等同龙24钟头的描绘,而是巧妙的起到了历史之范畴。书中为切实地关乎了呀是不利的辰观念。

延伸阅读

有关 Android 性能优化,网络达到发生几篇比较好的篇章,基本以 GOOGLE
的合法教程翻译过来的,质量比较高。可以参考一下。

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

冷知识

GC 是在 1959 年由于 John McCarthy 发明的,此说明是以化解 Lisp
编程语言里之内存问题的。《黑客和画家》笔者,硅谷最有影响力的孵化器企业
YC 创立者 Paul Graham 高度评价 Lisp
语言,认为编程语言发展及如今,还是无跳出 Lisp 语言在上世纪 60
年代所倡导之那些理念。并且,他尚将团结当初创业,实现财务自由之花色
Viaweb 的功成名就归功给 Lisp 语言。详细而阅览 Paul Graham
的这首博客和这篇博客。

《钟鼓楼》书评(无剧透)

总结

Google
视频介绍的始末是钢铁知识,了解这些知识可以协助我们写来高质量,高性能的代码。而
MAT, HPROF, Memory Monitor, Allocation Tracker
提供了一个“破案”的工具被我们。我们运用这些家伙,倒回来去发现代码里的问题。

科学 4

区区个简易的实例

内存抖动

通过一个非常简单的例子来演示内存抖动。这个事例里,在打定义 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。

科学 5

memory_churn

从今 Allocation Tracker 里看,一不善操作会有大气之内存分配起。

科学 6

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 来拘禁,内存占用越来越不行

科学 7

memory_tracker

利用
MAT
工具进行正规化分析。这是个坏死的话题。几乎可单独成几独章来讲。可以参见
MAT 本身由带的 Tutorials
来学。另外,当下篇文章里之分析方法是个是的发端。

示范代码用 Android Studio
开发环境,可以起这里下载。

     
 读此书前自己同大部分总人口同样当都的钟鼓楼就是一个地标性的古迹,但每当作者的笔下,钟鼓楼象征着岁月与历史。作者新颖地为时也线索,从1982年的日出写到了日落——整书只写了同样天吃鼓楼下一个不足挂齿的小四合院中普通人的悲悲喜喜,巧妙的牵连由四合院被的一个个人选同一个个门,以这种措施有哲理地解读在鼓楼,又或说解读着日和历史。

     
 虽然写被写的是上个世纪八十年代的在情景,却能吸引过多切实可行的沉思。看罢本书,我思念下次过钟鼓楼时见面用更深切的理念去看待其。