性能优化

App性能优化之内存优化(一)

2018-04-09  本文已影响285人  天宇sonny

为什么要进行内存优化?

      这个问题好像很尴尬!如果你要是这么问你们老大,估计他会默默的拿出搬砖让你自行了断,当然这个问题也没有一个准确的答案,与其追着问为什么要进行内存优化不如我们换位思考一下,如果不进行内存优化会导致哪些问题?这样是不是更加符合程序猿的逻辑思维能力。

如果不进行内存优化会产生哪些问题?

App运行内存限制,OOM导致App奔溃
      这个应该都不能叫做问题了,App奔溃对于程序猿来讲称之为"事故"是不是一点都不过分,我们都知道Android中App的运行是有内存限制的,不同的手机对于App的运行内存有这不同的大小限制,有的是256M,有的是512M,所以说如果不进行内存控制和优化,一旦超出手机的运行内存限制就会产生OOM导致App奔溃。

App运行性能:流畅性、响应速度和用户体验会受到影响
      这个其实很好理解了,如果说不进行内存优化,我们的App在运行效率,事件响应速度,以及用户体验很方面会大打折扣,可能我们的App最终就被我们的终端用户定义为“垃圾”,然后毫不犹豫的uninstall,然后就没有然后了。

如何查看手机对于App运行内存大小的限制?

      每部手机对于App的运行都是有内存限制的,可以通过一些命令和工具来具体查看每台手机对于App的具体运行内存限制是多少,方便我们进行内存优化参考,安卓系统服务提供了响应的API可以获取到当前手机对于App运行的内存限制。例如我们可以通过如下的方式获取当前手机对于App运行内存的大小限制:

ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
int memoryClasss =  manager.getMemoryClass(); // 以M为单位
int largeMemoryClass = manager.getLargeMemoryClass(); // 以M为单位,通过AndroidMainifest中进行配置,不建议使用

Android的内存管理方式

Android系统内存分配与回收方式
      一个App通常就是一个进程对应一个虚拟机,大家都知道Android系统底层是Linux系统,开发应用的框架是Java的。如下图所示,进入Linux系统中我们可以通过ps命令获取每个app对应到Linux的进程ID。

通过ps命令查看系统进程信息.jpg 可以通过dumpsys meminfo <packagename>的命令查看内存的heap分配情况,关注其中的一些重要信息有利于我们做内存优化分析。 通过dumpsys查看内存heap分配情况.jpg
Native Heap:主要是jni开发方式下的,C空间里的堆;
Dalvik Heap:虚拟机的堆;
Dalvik Other:虚拟机其他的使用情况;
Stack:堆栈的大小;
Ashmem:共享内存的大小;
Java Heap:Java堆的使用情况;
Native Heap:Native堆的使用情况;

      如果觉得App可能存在内存泄漏情况,主要是指app在运行过程中有些对象总是释放不了而且越来越多,运行的时候可以观察一下Total占用会越来越多,这样的话就说明app可能存在内存泄漏的情况。

      GC只在Heap剩余空间不够时才发出垃圾回收,GC在Java里面是垃圾收集器的缩写,我们大家都知道在C或者C++开发中如果内存空间不够的话,需要手动去释放;但是Java里用的是懒人策略,所谓懒人策略就是指你不用的内存,不用的变量放在哪里就好了,系统有个GC专门收集这部分内存,到时候统一进行释放,关于Java的GC策略有好处也有不好处,好处比如说:在开发过程中不用特别关注内存释放情况,不好处就像上面说的GC只在Heap剩余空间不够时才发出垃圾回收机制。

      GC触发时,所有的线程都是会被暂停,如果剩余空间不够,存在过多的内存垃圾,GC在处理时候会需要大量的时间,而且在处理的过程中所有的线程都会被暂停,极端的情况会产生内存抖动等现象影响用户使用。

上一篇下一篇

猜你喜欢

热点阅读