美文网首页
Android 内存管理方式

Android 内存管理方式

作者: 蓝库知识 | 来源:发表于2021-02-03 11:14 被阅读0次
    1、为什么要进行内存优化

    OOM导致崩溃
    app性能,流畅度问题,会使得界面卡顿

    2、内存分配与回收方式(GC机制)

    引用摘录自 Android 优化二 Java内存分配机制及内存泄漏

    JVM内存管理.png
    JVM内存分配策略

    方法区:

    主要存放静态数据、全局的static数据和一些常量。

    堆和栈:

    1.局部变量的基本数据类型和引用,存储于栈中,引用的对象实体存储于堆中。因为它们属于方法中的变量,生命周期随方法而结束。
    2.成员变量全部存储与堆中(包括基本数据类型,引用和引用的对象实体),因为它们属于类,类对象终究是要被new出来使用的。

    GC机制

    回收机制

    是从程序的主要运行对象(如静态对象/寄存器/栈上指向的堆内存对象等)开始检查引用链,当遍历一遍后得到上述这些无法回收的对象和他们所引用的对象链,组成无法回收的对象集合,而其他孤立对象(集)就作为垃圾回收

    GC监听:
    1.系统每进行一次GC操作时,都会在LogCat中打印一条日志

    日志的基本格式如下
    D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <Pause_time>
    第一部分GC_Reason,这个是触发这次GC操作的
    第二部分Amount_freed,表示系统通过这次GC操作释放了多少内存
    第三部分Heap_stats中会显示当前内存的空闲比例以及使用情况(活动对象所占内存 / 当前程序总内存)
    第四部分Pause_time表示这次GC操作导致应用程序暂停的时间。关于这个暂停的时间,Android在2.3的版本当中进行过一次优化,在2.3之前GC操作是不能并发进行的,也就是系统正在进行GC,那么应用程序就只能阻塞住等待GC结束。虽说这个阻塞的过程并不会很长,也就是几百毫秒,但是用户在使用我们的程序时还是有可能会感觉到略微的卡顿。而自2.3之后,GC操作改成了并发的方式进行,就是说GC的过程中不会影响到应用程序的正常运行,但是在GC操作的开始和结束的时候会短暂阻塞一段时间,不过优化到这种程度,用户已经是完全无法察觉到了

    2.OnTrimMemory回调,当内存快要不足的时候通知要做操作
    3.回收算法 主要针对堆中进行GC
    新生代 停止-复制(Stop-and-copy)清理法
    老年代 标记-整理算法
    永久代

    3、内存限制
    4、内存优化方式

    数据结构优化

    • 频繁的字段连接使用StringBuilder
    • ArrayMap、SparseArray替换HashMap
    • 内存抖动:大量的请求一次性的对象,申请完释放又申请又释放,导致gc不能及时回收

    对象复用

    • 复用系统自带资源
    • ListView等中的ConvertView复用
    • 避免在onDraw方法中执行对象的创建
    5、oom优化

    强引用、软引用的使用


    image.png

    临时bitmap的及时回收
    避免bitmap的浪费
    try catch某些大内存分配的操作
    加载bitmap:缩放比例、解码格式、局部加载

    内存泄漏

    非静态内部类、匿名类
    单例导致的内存泄漏
    需要手动关闭的对象没有关闭

    资料

    Android 内存管理
    Android性能优化(三)之内存管理
    Java 分代收集算法
    Android内存管理机制及优化方法
    Android内存泄漏场景及解决方法

    相关文章

      网友评论

          本文标题:Android 内存管理方式

          本文链接:https://www.haomeiwen.com/subject/txgtmqtx.html