文章目录

  • 一、 垃圾回收算法总结
  • 二、 分代收集算法补充
  • 三、 查看 Java 虚拟机
  • 四、 获取 Android 应用可使用最大内存
  • 五、 内存抖动标志
  • 六、 排查内存抖动
  • 七、 常见的造成内存抖动操作
  • 八、 从内存优化角度选择集合

一、 垃圾回收算法总结


【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 ) 介绍了 标记清除算法 , 复制算法 , 标记压缩算法 , 三种垃圾回收算法 ;

【Android 内存优化】垃圾回收算法 ( 分代收集算法 | Serial 收集器 | ParNew 收集器 | Parallel Scavenge 收集器 | CMS 并发标记清除收集器 ) 博客中介绍了分代收集算法 , 并对常用的垃圾收集器进行了介绍 , 下面总结一下垃圾回收算法 , 与垃圾收集器 ;

1. 垃圾回收算法 :

① 标记清除算法 : 标记可回收的对象 , 之后将标记的对象回收 ; 内存碎片化 ;

② 复制算法 : 使用一半内存 , 当无法申请内存时 , 直接将有效对象拷贝到另一半内存中 ; 浪费内存 , 效率低下 ;

③ 标记压缩算法 : 标记回收内存对象 , 整理内存 ; 增加了开销 ;

④ 分代收集算法 : 将内存分为年轻代 , 老年代 , 持久代 , 三块区域 ; 不同生命周期的内存对象进行不同的管理 ;

2. 垃圾收集器总结 :

① Serial 收集器 : 年轻代 , 复制算法 , 单线程 GC , 暂停用户线程 ;

② ParNew 收集器 : 年轻代 , 复制算法 , 多线程 GC , 暂停用户线程 ;

③ Parallel Scavenge 收集器 : 年轻代 , 复制算法 , 多线程 GC , 暂停用户线程 ( 关注吞吐量 ) ;

④ CMS ( Concurrent Mark Sweep ) 并发标记清除收集器 ( 重点 ) : 老年代 , 标记-清除算法 , 多线程 GC , 与用户线程并发 ( 短时间暂停 ) ;

⑤ Parallel Old 收集器 : 老年代 , 标记整理算法 , 多线程 GC , 暂停用户线程 ;

⑥ Serial Old 收集器 : 老年代 , 标记整理算法 , 单线程 GC , 暂停用户线程 ;

二、 分代收集算法补充


【Android 内存优化】垃圾回收算法 ( 分代收集算法 | Serial 收集器 | ParNew 收集器 | Parallel Scavenge 收集器 | CMS 并发标记清除收集器 ) 一、 分代收集算法 章节对分代收集算法做了下简介 , 感觉没有描述清楚 , 再补充下 :

1. 主流垃圾回收算法 : JVM , DVM 都采用了 分代收集算法 , 将内存划分成不同的内存区域 , 不同的区域采用不同的垃圾收集算法 , 这是目前主流的 Java 虚拟机都在使用的垃圾回收算法 ;

2. 分代收集算法的核心思想是 :

  • 不同的对象声明周期不同 , 承担的功能不同 ;
  • 有些对象声明周期比较长如 Android 中的 Application , Activity 等组件 ;
  • 有的对象生命周期很短 , 如打印日志时创建打印内容字符串 , 打印完毕后 , 该字符串对象马上就没用了 ;
  • 这里要将不同的生命周期长度的对象 , 分别使用不同的垃圾回收机制进行处理 , 这样可以提高垃圾收集的效率 ;

3. 分治思想 : 垃圾对象收集时 , 需要对整个内存空间进行扫描 , 这样消耗很大 , 这里我们将内存分区 , 将生命周期短的对象放在一块内存中 , 生命周期长的对象放在另一块内存中 , 这样针对不同的内存块 , 采取不同的垃圾回收策略 ; ( 分治思想 )

4. 内存块分块 : 将 Java 内存堆分为 年轻代 , 老年代 , 新创建的对象放在年轻代中 , 老对象转移到老年代中 ;

5. 年轻代内存分区 : 年轻代内存分为 Eden 和 Survivor 两个区域 , Survivor 区域又分为 From Space 和 To Space ;

复制算法分区 : 很明显 Eden 和 Survivor 是复制算法中的两个区域 , From Space 和 To Space 也是复制算法中的两个区域 ;

6. 年轻代内存策略 : 复制算法 ;

  • 新对象存放 : 新创建的对象都放在年龄代内存中的 Eden 区域中 ;

  • 第一次复制算法 : 当 Eden 区域放满时 , 将存活的区域放到 Survivor 区域中的 From Space ( To Space ) 区域中 ;

  • 第二次复制算法 : 当 From Space ( To Space ) 区域中存放后 , 会将年龄不足晋升的对象复制到另一侧的 To Space ( From Space ) 区域中 ;

  • 晋升机制 : 年轻代内存中 , 一旦对象经理的 GC 次数达到一定阈值 , 就会晋升到老年代内存中 ;

7. 老年代内存策略 : 标记整理算法 ; Android 中使用的是 CMS 垃圾收集器 ;

三、 查看 Java 虚拟机


查看 Java 虚拟机 : 在命令行中执行 java -version , 即可查看当前 java 虚拟机情况 ;

C:\Users\octop>java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)C:\Users\octop>

上述虚拟机是 HotSpot 虚拟机

四、 获取 Android 应用可使用最大内存


OOM 就是应用的内存超过了堆的最大值 , 内存分配的单位是进程 , 每个进程都会有一定的内存限制 ,

1. 获取当前 Android 手机的最大使用用内存 :

① 代码获取 : 调用 ActivityManager 对象的 getMemoryClass 方法获得内存对象 ;

② 执行如下命令 :

adb shell getprop dalvik.vm.heapsize

命令执行结果 :

C:\Users\octop>adb shell getprop dalvik.vm.heapsize
512mC:\Users\octop>

2. 获取其它值 :

# 获取 app 最大申请内存, 超过就 OOM
$ adb shell getprop dalvik.vm.heapsize
512m# 获取初始内存大小
$ adb shell getprop dalvik.vm.heapstartsize
8m# 正常情况下的内存值
$ adb shell getprop dalvik.vm.heapgrowthlimit
192m

3 . 指定极限大小 : 在 AndroidManifest.xml 中的 application 标签中指定 android:largeHeap 为 true , 为该进程设置堆内存极限大小 ;

五、 内存抖动标志


在 Android Profiler 中监控 Memory 内存 , 如果出现下图样式的内存图 , 说明出现了内存抖动 ;

六、 排查内存抖动


内存抖动查找 , 直接跳转到 Android Profiler 界面 , 点击 Dump Java Heap 按钮 , 保存一份内存快照 , 找出消耗内存最多的对象 , Allocations 个数最多的对象的类 , 该类对象大概率就是造成内存抖动的原因 ;

七、 常见的造成内存抖动操作


1. 日志打印 : 循环中使用 Log.i 函数打印日志 , 使用加号拼接字符串 , 尤其是每次拼接不同的字符串 , 每个字符串都需要创建释放 , 这样会造成内存抖动 ;

2. 循环操作 : 在循环内频繁创建对象 , 与销毁对象 ; 尽量将创建对象操作放在成员级别 , 或放在循环体外部 ;

八、 从内存优化角度选择集合


HashMap 集合 : HashMap 有一个默认大小 , 还有一个扩容因子 ; 如默认大小 100 , 扩容因子 0.8 , 该集合只能存储了 80 个 , 之后如果还想向其中存储数据 , 就需要扩容 , 扩容时 , 直接在默认大小基础上翻倍 ;

SparseArray 集合 : SparseArray 有默认大小 , 没有扩容因子 , 每次扩容 , 直接翻倍 ; SparseArray 的增删查改都要进行二分查找 ; SparseArray 的 Key 是 int 类型 , 其不必使用 Integer 包装类型 ; 数据量很大时 , 且需要键值对数据结构时 , 考虑使用 SparseArray 集合 ;

【Android 内存优化】内存抖动 ( 垃圾回收算法总结 | 分代收集算法补充 | 内存抖动排查 | 内存抖动操作 | 集合选择 )相关推荐

  1. 2、垃圾回收算法(标记清除算法、复制算法、标记整理算法和分代收集算法),各种垃圾收集器讲解(学习笔记)

    2.垃圾回收概述 2.1.垃圾回收算法 2.1.1.垃圾回收算法-标记清除算法 2.1.2.垃圾回收算法–复制算法 2.1.3.垃圾回收算法–标记整理算法和分代收集算法 2.1.4.垃圾回收算法–Se ...

  2. 【Android 内存优化】垃圾回收算法 ( 分代收集算法 | Serial 收集器 | ParNew 收集器 | Parallel Scavenge 收集器 | CMS 并发标记清除收集器 )

    文章目录 一. 分代收集算法 二. 垃圾回收器 / 收集器 ( GC ) 三. 串行收集器 ( Serial ) 四. ParNew 收集器 五. Parallel Scavenge 收集器 六. C ...

  3. 26 Java GC算法 垃圾收集器、标记 -清除算法、复制算法、标记-压缩算法、分代收集算法

    26.Java GC算法 垃圾收集器 1.1.1标记 -清除算法 1.1.2复制算法 1.1.3标记-压缩算法 1.1.4分代收集算法 26.Java GC算法 垃圾收集器 概述 垃圾收集 Garba ...

  4. JVM学习-分代收集算法

    分代收集算法 1.分代回收算法概述 1.1.分代回收算法简介 1.2.回收流程 1.3.回收流程总结 2.相关VM参数 3.GC分析 1.分代回收算法概述 1.1.分代回收算法简介 我们在前面讲了三种 ...

  5. 欧尼酱讲JVM(22)——分代收集算法

    目录 分代收集算法 HotSpot中的分代收集 年轻代 老年代 没有一种最好的算法吗?没有,没有最好只有最适合.具体问题具体分析! 上一篇文章<欧尼酱讲JVM(21)--垃圾回收相关算法> ...

  6. 【JVM】四种GC算法(分代收集+三种标记算法)

    目录 参考文章 四种GC算法 分代收集算法(理论) 标记清除算法 标记整理算法 标记复制算法 三种算法的优缺点 参考文章 JVM的4种垃圾回收算法.垃圾回收机制与总结_我是guyue,guyue就是我 ...

  7. 简介三种垃圾回收机制:分代复制垃圾回收,标记垃圾回收,增量垃圾回收

    一.分代复制垃圾回收 不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比 ...

  8. 垃圾回收中的分代年龄

    为什么CMS里的分代年龄是6而不是15 CMS (Concurrent Mark Sweep) 是一种基于分代的垃圾收集器,其中分代年龄指的是一个对象在年轻代中经历了多少次垃圾收集.在 CMS 中,当 ...

  9. 深度解析Python的内存管理机制:垃圾回收机制

    Python程序在运行时,需要在内存中开辟出一块空间,用于存放运行时产生的临时变量,计算完成后,再将结果输出到永久性存储器中.但是当数据量过大,或者内存空间管理不善,就很容易出现内存溢出的情况,程序可 ...

最新文章

  1. JavaScript中this关键字使用方法详解
  2. SpringMVC拦截器2(资源和权限管理)(作为补充说明)
  3. java阻塞队列作用_简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用...
  4. 存储过程与触发器的应用
  5. Jmeter插件安装及使用
  6. 基于springboot+vue的房屋租赁系统(前后端分离)
  7. nginx反向代理镜像网站做小偷站
  8. 分布式文件系统 -- OSS云存储
  9. 实际BCI应用:异步EEG/EOG BCI手抓取和释放的可行性
  10. IOS 读二进制数据文件
  11. iQOO正式面世,vivo怎么玩转独立子品牌?
  12. Warshall 算法(离散数学传递闭包)
  13. 通过软件架构来达到易用性-易用性的好处
  14. 使用PlayCanvas制作一个简单的小游戏(四)
  15. 全文检索第一篇lucene的使用
  16. 谷歌开放生成式AI Bard,百度文心一言《唐伯虎点秋香》出圈
  17. 主流的操作系统(带你快速了解)
  18. virtualbox pxe启动
  19. java mina spring_Mina入门教程(二)----Spring4 集成Mina
  20. 丁鹿学堂:js之函数式编程的优势

热门文章

  1. 在ubuntu10.4安装snort ACID
  2. linux 每日学一点《Linux架设代理服务器(2)》
  3. postman参数化 接口响应数据获取符合条件的内容参数化给后面的接口使用
  4. eclipse中访问不了tomcat首页server Locations变灰无法编辑
  5. SVG 基本绘图方法总结
  6. Eclipse+Tomcat7.0+MySQL 连接池设置
  7. Ajax调用webService(一) 不跨域。
  8. XP 风格的可拖动列、可排序、可改变宽度的DataGrid的例子
  9. 关于可扩展的web架构设计的探索-框架结构的描述文件
  10. 2.25-3.2 周记