App性能优化之内存优化(一)
为什么要进行内存优化?
这个问题好像很尴尬!如果你要是这么问你们老大,估计他会默默的拿出搬砖让你自行了断,当然这个问题也没有一个准确的答案,与其追着问为什么要进行内存优化不如我们换位思考一下,如果不进行内存优化会导致哪些问题?这样是不是更加符合程序猿的逻辑思维能力。
如果不进行内存优化会产生哪些问题?
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。
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在处理时候会需要大量的时间,而且在处理的过程中所有的线程都会被暂停,极端的情况会产生内存抖动等现象影响用户使用。