【Android面试周】性能优化之内存篇

【Android面试周】系列文章会持续更新,订阅后的读者若在阅读中存在问题可随时添加评论,我会及时回复。


性能优化一直是高级Android工程师必问的,这也往往涉及到对Java、JVM、Android运行机制、监控工具使用等全方位的知识点,是很好的面试方向。

本篇会围绕Android与Java的性能优化专项之内存展开并深入。


内存是Android运行性能至关重要的一项指标,每个进程能使用的内存是有限的。不合理的使用内存会导致频繁的GC、甚至发生OOM,过多GC会导致App卡顿,而内存泄漏或者内存抖动都可以导致OOM,这是无法接受的。

因此,对于一个合格的高级Android工程师,必须保持对内存的高度敏感性,本文会针对内存提出一系列性能优化手段。

什么时候会导致频繁GC

  1. 内存抖动
    短时间内创建了大量对象同时又被快速释放。比如在一个大循环里去不断创建对象,会导致频繁gc;
  2. 内存泄漏
    内存泄漏会导致可用内存逐渐变少,而且内存碎片加多,这也会增多gc次数,甚至可能发生OOM
  3. 一次申请太大内存空间
    由于内存碎片的存在,就算内存本身足够,但由于碎片导致无法找到一块大空间,这也会触发gc;

内存优化准则

1. 能不创建的对象就不创建

比如字符串拼接,可以手动使用StringBuilder,而不是使用"+","+"被编译器优化后会每次创建StringBuilder对象,造成浪费;

而且,尤其注意在主线程里不要过多创建对象。因为在GC时会锁住堆内存,此时请求分配的线程也会被挂起,这显然会导致主线程的卡顿。所以在一些主线程高频函数,如onDraw,onTouchEvent里不要去创建对象。

2. 尽可能复用已经创建的对象

top Created with Sketch.