Android程序员的开发焦点问题OOM优化
2023-07-26 本文已影响0人
谁动了我的代码
OOM(Out of Memory)问题是指在计算机系统中,当可用内存耗尽时,无法为新的进程或线程分配所需的内存空间,从而导致系统崩溃或程序异常终止的问题。
解决OOM有那些方面入手
ADJ内存管理机制
ADJ(Adjustment)是Android操作系统中的一个内存管理机制,用于根据应用程序的重要性和使用情况,动态调整应用程序的内存占用。ADJ机制根据应用程序的调度优先级,将应用程序分为不同的优先级组,并根据优先级组的不同,对应用程序的内存占用进行调整。
ADJ机制的优先级组如下:
- 前台(Foreground):处于前台运行的应用程序,即当前用户正在交互的应用程序。前台应用程序的内存占用最高,系统会尽量保证其可用内存。
- 可见(Visible):虽然不处于前台,但是对用户可见的应用程序。可见应用程序的内存占用较高,系统会尽量保留一定的内存给可见应用程序。
- 服务(Service):后台运行的服务应用程序。服务应用程序的内存占用较低,系统会根据需要分配一定的内存给服务应用程序。
- 后台(Background):不处于可见状态且没有运行服务的应用程序。后台应用程序的内存占用较低,系统会根据需要分配一定的内存给后台应用程序。
- 空进程(Empty Process):不包含任何活动组件的应用程序。空进程的内存占用最低,系统会尽量回收其内存。
根据ADJ机制,系统会根据应用程序的优先级组和内存使用情况,动态调整应用程序的内存占用。例如,当系统内存不足时,系统可能会优先回收后台应用程序的内存,以保证前台和可见应用程序的正常运行
JVM内存回收机制
JVM的内存回收机制是通过垃圾收集器(Garbage Collector)来实现的。JVM的内存回收机制主要包括以下几个方面:
- 对象的生命周期管理:JVM通过跟踪对象的引用关系来确定对象是否还在使用中。当对象不再被引用时,JVM会将其标记为垃圾对象。
- 垃圾收集器的选择:JVM提供了不同类型的垃圾收集器,如串行收集器、并行收集器、CMS收集器、G1收集器等。开发者可以根据应用程序的特点和需求选择合适的垃圾收集器。
- 标记-清除算法:这是最基本的垃圾收集算法。它通过标记所有活动对象,然后清除所有未标记的对象。标记-清除算法的缺点是会产生内存碎片。
- 复制算法:为了解决内存碎片问题,复制算法将可用内存空间分为两个区域,每次只使用其中一个区域。当一个区域的内存使用满了,活动对象会被复制到另一个区域,然后清除当前区域中的所有对象。
- 标记-整理算法:这是一种改进的标记-清除算法。它在标记阶段将所有活动对象标记,然后将活动对象向一端移动,最后清除掉空闲的内存空间。
- 分代收集算法:JVM将内存分为不同的代,如新生代和老年代。新创建的对象通常会被分配到新生代,而长时间存活的对象会晋升到老年代。不同的代可以使用不同的垃圾收集算法进行回收。
- 垃圾收集的触发和调优:JVM会根据不同的条件触发垃圾收集,如当内存占用达到一定阈值时。开发者可以通过调整JVM的参数来优化垃圾收集的性能和效果。
GC算法解析
GC(Garbage Collection)算法是用于自动回收不再使用的内存的一种算法。以下是一些常见的GC算法解析:
- 标记-清除算法(Mark and Sweep):这是最基本的GC算法之一。它通过两个阶段来进行垃圾回收。首先,在标记阶段,从根对象开始,遍历所有可达的对象,并标记为存活。然后,在清除阶段,清理掉未被标记的对象,并释放其占用的内存空间。标记-清除算法的缺点是会产生内存碎片。
- 复制算法(Copying):为了解决标记-清除算法的内存碎片问题,复制算法将可用内存空间划分为两个区域,如Eden区和Survivor区。当Eden区满时,还存活的对象会被复制到Survivor区,然后清空Eden区。Survivor区满时,存活的对象会被复制到另一个Survivor区或老年代。复制算法保证了内存空间的连续性,但会浪费一部分内存空间。
- 标记-压缩算法(Mark and Compact):标记-压缩算法是标记-清除算法的改进版。在标记阶段,它会标记出所有存活的对象。然后,在压缩阶段,它会将所有存活的对象向一端移动,并清理掉移动后的末尾空间。标记-压缩算法解决了标记-清除算法的内存碎片问题,但需要大量的对象移动操作。
- 分代收集算法(Generational Collection):分代收集算法是基于对象生命周期的观察。根据对象的存活时间将内存划分为不同的代,如新生代和老年代。新创建的对象通常会被分配在新生代,而较长存活的对象则会晋升到老年代。分代收集算法可以根据不同代的特性,使用不同的GC算法进行垃圾回收,以达到更高的效率。
- 并发标记清除算法(Concurrent Mark and Sweep):并发标记清除算法是一种并发的垃圾回收算法,它在应用程序运行的同时进行垃圾回收。它通过并发地标记存活对象,然后在暂停应用程序的短暂时间内清除未标记的对象。并发标记清除算法可以减少垃圾回收对应用程序的影响,但可能会增加垃圾回收的开销。
本文主要以原理解析了在Android开发中的OOM开发焦点问题,关于更多Android性能优化问题可以参考《Android核心性能优化解析》点击可以查看详细类目。
去除 OOM(Out of Memory)问题其他总结
- 优化内存使用
- 使用合适的数据结构和算法
- 优化图像和资源
- 限制加载的数据量
- 使用内存管理工具
- 避免频繁的对象创建和垃圾回收
- 使用合理的缓存策略
- 适当配置应用程序的内存参数
- 考虑使用内存管理库