聊一聊:内存优化的目的是什么?

在开始之前需要先搞明白一个问题,为什么要做内存优化?或者说做内存优化的目的是什么?

内存优化的主要目的是提高应用程序运行的效率和性能,并减少应用程序由于内存问题导致的崩溃或者卡顿情况。当一个应用程序运行时,它需要通过系统申请一部分内存空间来存储程序数据,但是如果这部分内存空间使用过多,就会导致整个系统内存的不稳定以及其他应用程序的运行受到影响。

因此,通过对Android应用程序内存空间的管理和优化,可以使得应用程序运行更加顺畅,提高应用程序的响应速度和性能,并且可以避免由于内存不足导致的崩溃或者卡顿情况。同时,对于低端设备或者内存较小的设备,内存优化也能够提高设备的稳定性和流畅度,提高设备的用户体验。

一、因内存造成的问题有哪些?

1. 内存大的进程会被优先回收

Android 是基于 Linux 内核实现的。Linux的内存管理哲学是:Free memory is wasted memory。即内存没有得到充分利用就是在浪费内存。因此 Linux 希望尽可能多的使用内存,较少磁盘 IO 。Android 系统继承了 Linux 的优点,同样是尽最大限度使用原则。但与Linux不同的是 Android 侧重于可能多的缓存进程以提高应用启动和切换速度。即,Android系统会在内存中尽量的长时间的保持应用进程,直到系统分配内存不足时才会去根据进程优先级、内存代销等条件回收进程。这些保留在内存中的进程通常不会影响系统整体的运行速度,反而会在用户再次激活这些进程时,加快进程的启动速度。

当Android系统需要为其他应用分配更多内存是,如果发现内存不足,便会根据条件关闭某些后台进程以回收内存。

  • 在Android 7之后(之前是oom_adj)的系统中有一个oom_score_adj的值表示应用的优先级,oom_score_adj越大,进程的优先级越低,越容易被回收。
  • 系统会使用LRU算法来优先从最近最少使用的进程开始遍历,因此最近最少使用的进程被回收的概率比较高。
  • 系统还会考虑使用内存较多的进程优先回收。

概括来说,当系统分配内存时发现内存不足,则会根据进程优先级、最近最少使用、进程占用内存等条件综合评判进行进程回收。显然低内存的进程被回收的可能性比较低,因此,为了保证用户体验应该尽可能的减少进程占用的内存。

2. 单个进程使用的内存是有限的。

Android 系统的java虚拟机会对单个进程使用的最大内存做限制,这个属性值定义在/system/build.prop文件中,厂商一般会根据设备自身内存大小来设定这个值,因此,不同的设备分配给APP的最大可用内存是不相同的。当进程启动时,系统会先为APP分配一定的内存空间,当分配的内存快要耗尽时,系统会再次为App 分配更多的内存,但是每个APP都有内存使用上限,一旦进程分配了最大可用内存后,内存依然不足则会直接抛出OOM异常,终止程序的运行。

因此,占用较大内存的APP会导致OOM异常的可能性,基于这点更需要我们针对性的做内存优化,避免OOM。

3. GC 时 STW 影响程序性能

当进程使用内存达到设定的阈值时,就会触发虚拟机的GC机制,无论是java的Hotspot虚拟机还是Android的Dalvik 或者ART虚拟机,在进行垃圾回收时都会存在暂停其他线程的问题,被称作Stop The World(简称SWT)。当发生SWT时,所有的其他线程都会被停止运行,等待GC结束后才会再次执行。虽然JDK中的较新的垃圾收集器向ZGC、Shenandoha以及ART自身的垃圾收集器等已经将STW的时间减小,但还是STW还是不能避免。

当内存不足或者出现内存抖动时都会频繁的出发GC机制进行垃圾回收。而由于频繁的GC导致频繁的的STW,进而导致严重的程序的性能问题。因此,为了提升程序性能,有必要进行内存优化。

二、内存优化策略

内存优化可以考虑从两个方面入手,一方面是大对象的优化,应该想办法减小大对象占用的内存;另一方面则是从内存泄漏及内存抖动等方面去优化内存。

1. Bitmap等大对象的优化策略

APP中的内存问题多半是因为Bitmap引起的。因此,解决Bitmap的问题就解决了一半的内存问题。要解决Bitmap的内存首先要知道Bitmap占用的内存是如何计算的。Bitmap的内存计算公式如下:

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值