博客
关于我
Android GC原理探究(深度好文)
阅读量:620 次
发布时间:2019-03-13

本文共 1524 字,大约阅读时间需要 5 分钟。

Android内存管理与垃圾回收机制深度分析

1. JVM内存回收机制

1.1 回收算法

内存回收算法主要有以下几种:

标记回收算法(Mark and Sweep GC)

从"GC Roots"集合开始,标记所有可以通过根对象链间接到达的对象,标记完成后,清理未被标记的对象。由于需要中断应用程序的执行,且会导致内存碎片,适合用于老生代回收。

复制算法 (Copying)

将内存分为两部分,使用其中一部分存活对象,复制到另一部分后清理当前内存。由于需要额外空间,通常用于新生代回收。

标记-压缩算法 (Mark-Compact)

先标记存活对象,随后将存活对象压缩到一端,清理边界外空间。压缩避免了内存碎片,适合老生代回收。

分代

将对象分为新生代和老生代。新生代使用复制算法,老生代使用标记-压缩算法。新生代对象若存活需移到老生代。

1.2 复制和标记-压缩算法的区别

复制算法和标记-压缩算法在空间与时间上的权衡不同。复制算法需额外空间,但执行时间短;标记-压缩算法不需额外空间,但执行时间长。新生代的复制算法更适合频繁分配对象的场景。

2. Dalvik虚拟机

2.1 Java堆结构

Java堆由Zygote堆和Active堆组成。Zygote堆用于预加载对象,Active堆用于应用程序内存分配。COW(Copy On Write)策略减少内存拷贝,优化性能。

2.2 堆内存管理

堆内存由Starting Size、Maximum Size和Growth Limit控制。Min Free、Max Free和Target Utilization影响内存碎片和优化策略。频繁分配对象会触发GC,导致卡顿。

2.3 GC类型

GC类型包括GC_FOR_MALLOC、GC_CONCURRENT、GC_EXPLICIT和GC_BEFORE_OOM。GC类型影响触发时机和性能表现。

2.4 对象分配与GC触发

内存分配失败时触发GC。不同GC类型有不同的触发条件和处理流程。GC后的内存恢复逻辑需遵循特定顺序。

2.5 内存碎片与优化

Mark and Sweep算法易导致碎片,需通过减少临时对象和长生命周期对象来优化。

3. ART内存回收机制

3.1 Java堆结构

ART堆分为Image Space、Zygote Space、Allocation Space和Large Object Space。Large Object Space用于管理大对象,优化GC效率。

3.2 GC类型

GC类型包括kGcCauseForAlloc、kGcCauseBackground、kGcCauseExplicit等。并发GC和非并发GC的主要区别在于是否挂起线程。

3.3 并发与非并发GC

并发GC在标记阶段不阻塞线程,减少停顿时间。ART并发GC在处理脏数据时更高效,提升性能。

3.4 前后台GC

Foreground GC用于前台应用,Mark-Sweep算法减少卡顿。Background GC用于后台,Mark-Compact算法优化碎片率。

3.5 Art优势

ART在GC效率和内存管理上优于Dalvik。并发GC减少停顿,Large Object Space减少大对象回收压力。

4. GC日志分析

4.1 Dalvik日志

日志包含GC原因、释放内存量、堆状态、暂停时间和总耗时。信息详细有助于分析GC性能。

4.2 Art日志

日志包含GC原因、释放内存量、LOS状态、堆状态、暂停时间和总耗时。LOS状态显示大对象空间使用情况,帮助监控内存管理。

通过理解和优化这些机制,可以显著提升Android应用的性能和稳定性。

转载地址:http://qziaz.baihongyu.com/

你可能感兴趣的文章
Plotly 停用 x 轴排序
查看>>
Plotly 域变量解释(多图)
查看>>
Plotly 绘制表面 3D 未显示
查看>>
Plotly-Dash 存在未知问题并创建“加载依赖项时出错“;通过使用 Python-pandas.date_range
查看>>
Plotly-Dash:如何过滤具有多个数据框列的仪表板?
查看>>
Plotly:如何为 x 轴上的时间序列设置主要刻度线/网格线的值?
查看>>
Plotly:如何从 x 轴删除空日期?
查看>>
Plotly:如何从单条迹线制作堆积条形图?
查看>>
Plotly:如何以 Root 样式绘制直方图,仅显示直方图的轮廓?
查看>>
Plotly:如何使用 Plotly Express 组合散点图和线图?
查看>>
Plotly:如何使用 plotly.graph_objects 和 plotly.express 定义图形中的颜色?
查看>>
Plotly:如何使用 Python 对绘图对象条形图进行颜色编码?
查看>>
Plotly:如何使用 updatemenus 更新一个特定的跟踪?
查看>>
Plotly:如何使用长格式或宽格式的 pandas 数据框制作线图?
查看>>
Plotly:如何向烛台图添加交易量
查看>>
Plotly:如何在 plotly express 中找到趋势线的系数?
查看>>
Plotly:如何在桑基图中设置节点位置?
查看>>
Plotly:如何处理重叠的颜色条和图例?
查看>>
Plotly:如何手动设置 plotly express 散点图中点的颜色?
查看>>
Plotly:如何结合 make_subplots() 和 ff.create_distplot()?
查看>>