关于“软件性能优化”一直是开发人员努力的方向,以及最终的目标,因为强悍优越的性能对于一款APP来说是非常重要的,一定程度上决定了是否能够留住用户;所以,优化APP性能的脚步不能停歇;那么我们可以使用工具来分析APP的性能,开发人员能够快速得知导致性能问题的原因所在,并且使用工具可以节约开发人员时间成本。话不多说回归主题,下面我来给大家讲解下软件性能优化的“内存优化”,以及使用工具的便捷!
一、内存优化
Android内存管理机制
Android应用都是在Android的虚拟机上运行,应用程序的内存分配与垃圾回收都是由虚拟机完成的。在Android系统,虚拟机有两种运行模式:Dalvik和ART。
Java对象生命周期
一般Java对象在虚拟机上有7个运行阶段:
创建阶段-应用阶段-不可见阶段-不可达阶段-收集阶段-终结阶段-对象空间重新分配阶段。
2、内存分配
在Android系统中,内存分配实际上是对堆的分配和释放。当一个Android程序启动,应用进程都是从一个叫做Zygote的进程衍生出来,系统启动Zygote进程后,为了启动一个新的应用程序进程,系统会衍生Zygote进程生成一个新的进程,然后在新的进程中加载并运行应用程序的代码。其中,大多数的RAMpages被用来分配给Framework代码,同时促使RAM资源能够在应用所有进程之间共享。
但是为了整个系统的内存控制需要,Android系统会为每一个应用程序都设置一个硬性的DalvikHeapSize最大限制阈值,整个阈值在不同设备上会因为RAM大小不同而有所差异。如果应用占用内存空间已经接近整个阈值时,再尝试分配内存的话,就很容易引起内存溢出的错误。
3、内存回收机制
我们需要知道的是,在Java中内存被分为三个区域:YoungGeneration(年轻代)、OldGeneration(年老代)、PermanentGeneration(持久代)。最近分配的对象会存放在YoungGeneration区域。对象在某个时机触发GC回收垃圾,而没有回收的就根据不同规则,有可能被移动到OldGeneration,最后累积一定时间在移动到PermanentGeneration区域。系统会根据内存中不同的内存数据类型分别执行不同的GC操作。GC通过确定对象是否被活动对象引用来确定是否收集对象,进而动态回收无任何引用的对象占据的内存空间。但需要注意的是频繁的GC会增加应用的卡顿情况,影响应用的流畅性,因此需要尽量减少系统GC行为,以便提高应用的流畅度,减小卡顿发生的概率。
4、优化内存空间没有内存泄漏,并不意味着内存就不需要优化,在移动设备上,由于物理设备的存储空间有限,Android系统对每个应用进程也都分配了有限的堆内存,因此使用最小内存对象或者资源可以减小内存开销,同时让GC能更高效地回收不再需要使用的对象,让应用堆内存保持充足的可用内存,使应用更稳定高效地运行。常见做法如下:
1)对象引用。强引用、软引用、弱引用、虚引用四种引用类型,根据业务需求合理使用不同,选择不同的引用类型。
2)减少不必要的内存开销。注意自动装箱,增加内存复用,比如有效利用系统自带的资源、视图复用、对象池、Bitmap对象的复用。
3)使用最优的数据类型。比如针对数据类容器结构,可以使用ArrayMap数据结构,避免使用枚举类型,使用缓存Lrucache等等。
4)图片内存优化。可以设置位图规格,根据采样因子做压缩,用一些图片缓存方式对图片进行管理等等。
下面继续了解下检测分析APP性能的工具——友盟,同时这也是我个人正在使用的工具,很大程度的提高了日常工作效率,非常好用且便捷,接下来一起了解下友盟吧!
友盟详解
1、U-APM是友盟+推出的App稳定性监控、性能监控和云真机测试平台。U-APM可以帮助我们深入了解应用的性能和稳定性,帮助我们高效提升应用的质量。通过实时采集新版本上线后的崩溃信息,提供了多种辅助定位问题的关键信息及多维度分析报表,从而能够快速发现问题、定位问题、解决问题。
2、核心优势
1)捕获采集类型丰富,支持Java、Native、Swift、Objective-C、ANR、自定义异常的捕捉。
2)快速定位错误根源,提供行为日志、详细日志、内存快照、设备信息、自定义字段,帮您快速发现问题原因,提升问题解决效率。
3)智能告警专业服务,提供邮件、钉钉、飞书、企业