Android高级开发之性能优化典范

2019-12-10 18:01:22于丽

 Android,Android开发

图2  对象值临近阀值触发GC操作

    通常情况下,GC发生的时候,所有的线程都是会被暂停的。执行GC所占用的时间和它发生在哪一个Generation也有关系,Young Generation中的每次GC操作时间是最短的,Old Generation其次,Permanent Generation最长。执行时间的长短也和当前Generation中的对象数量有关,遍历树结构查找20000个对象比起遍历50个对象自然是要慢 很多的。

(2)内存测试插件

1)LeakCanary简介

    LeakCanary是一个用于检测内存泄漏的工具,可以用于Java和Android,是由著名开源组织Square贡献。

Android,Android开发

2)LeakCanary工作原理

 •RefWatcher.watch()创建一个KeyedWeakReference到北监控的对象。

 •接下来,在后台线程中检测这个引用是否被清除,如果没有将会触发GC。

•如果引用仍然没有清除,将heap内存dump到一个.hprof的文件存放到手机系统里。

 •HeapAnalyzerService在另外一个独立的进程中启动,使用HeapAnalyzer解析heap内存通过HAHA这个项目

 •HeapAnalyzer计算出到GC ROOTs的最短强引用路径决定是否发生Leak,然后建立导致泄漏的引用链。 结果被回传到应用程序进程的DisplayLeakService中,然后显示一个泄漏的通知。

(3)内存优化

1)谨慎使用large heap

    Android设备根据硬件与软件的设置差异而存在不同大小的内存空间,他们为应用程序设置了不同大小的Heap限制阈值。设计时可以通过调用getMemoryClass()来获取应用的可用Heap大小。在一些特殊的情景下,你可以通过在manifest的application标签下添加 largeHeap=true的属性来为应用声明一个更大的heap空间。然后,你可以通过getLargeMemoryClass()来获取到这个更大的heap size阈值。