Comments

最近在整理Evernote,看到当年读这本书的一些笔记。

  • 富人买入资产,穷人只有支出,中产买入他们以为是资产的负债
  • 资产的类别:
    • 不需要我到场就能运作的业务
    • 股票、基金、债券
    • 可以产生收入的房地产
    • 其他可以产生收入且市场流通性好的东西
  • 找到一个超现实的理由:想要与不想要的结合体
  • 每天做出自己的选择:使用我们的时间、金钱以及头脑里的知识来实现目标
  • 掌握一种模式,然后再学习一种新的模式:并不要求你学太多,(因为你学到的时候,这个东西基本上就已经过时了)而在于你学得有多快
  • 自律,可以增强上述所有功能

Google 最近搞了个Android Performance Patterns, 挺好的,光这个名字,就已经给整个社区很好的定位了。其实性能优化这档子事吧,android 社区从来就有。只不过,从前都是只言片语,大伙也只能各自摸着石头过河。这一次Google不但在G+上搞了这个讨论区,还以“Patterns”的形式推出了一套指导视频,从渲染、内存、电池三大方面剖析了性能优化的方法、工具以及一些小的技巧。这一系列的动作,引发了各界不小的反应,我还看到有国内的开发者把这套视频翻译为”android性能优化典范“,着实给力呢。

既然有了这么好的氛围,这个博客也打算凑凑热闹,帮忙翻译、整理一些和性能优化有关的Tips。你可能不敢相信,一个简单的优化步骤能带来多大的性能提升?!让我们先看一张图:

如果你已经看过Profile GPU Rendering 的介绍,一定会被这幅对比图惊艳到。仅仅是一个alpha 属性的设置,两者的渲染性能差别如此之大。据Roamn Nurik 介绍view的alpha属性在合成之前需要放到屏幕外的缓冲区中作额外的渲染工作。但,如果只对textcoloralpha属性的设置,渲染性能立刻提升了10倍

与之类似,在TextView中使用background set,Spannable text以及让文字被选中,都会加重渲染的负担。了解渲染负担并合理的避免,应该才是性能优化的王道。

参考资料

Comments

0x00 加载

  • 类的加载本质上是由类加载器将字节码转换为java.lang.Class对象的过程
  • 除了引导类加载器之外,所有的类加载器都有一个父类加载器
  • 每一层的类加载器在收到加载请求之后,会将请求委派给父加载器执行;只有父加载器无法完成加载请求的时候,子加载器才尝试自己加载
  • 这种双亲委托模型一方面避免了类的重复加载,另一方面还能防止Java 核心API被子加载器替换带来的隐患

0x01 链接

  • 链接分为三步:验证、准备和解析。其本质上是将字节码合入JVM运行时的过程。
  • 验证阶段主要是确认字节码结构的合法性,一旦验证失败,JVM会抛出java.lang.VerifyError异常
  • 准备阶段主要是将Java类的静态域初始化为默认值(并不执行任何代码)
  • 解析阶段主要是确保所有引用的类能被正确的找到,这通常会导致引用类被加载

0x02 初始化

该阶段的任务主要是初始化静态域,以及执行静态块代码。一个类被初始化之前,其父类会被先初始化。关于这一点,有2个需要注意的地方:

  • 通过Java反射API也可能造成类的初始化
  • 当访问一个类的静态域时,只有真正声明这个域的类才会被初始化。则,考虑如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Base {
   static int value = 100;
   static {
      System.out.println("我会被输出.");
   }
}

class A extends Base {
   static {
      System.out.println("我不会被输出");
   }
}

public class Test {
   public static void main(String[] args) {
      System.out.println(A.value);
   }
}

如上所述,上述代码的运行结果为:

0x03 参考资料