【ART 内存管理】堆内存分布与分配

堆内存分布

ART中的堆内存主要通过 Space 相关类进行管理,因此了解Heap的内存布局,首先需要了解有哪些Space。

如下是Heap中所有Space的继承关系。

Space枚举有下面几种类型:

c++ 复制代码
# /art/runtime/gc/space/space.h

69  enum SpaceType {
70    kSpaceTypeImageSpace,
71    kSpaceTypeMallocSpace,
72    kSpaceTypeZygoteSpace,
73    kSpaceTypeBumpPointerSpace,
74    kSpaceTypeLargeObjectSpace,
75    kSpaceTypeRegionSpace,
76  };

58  enum GcRetentionPolicy {
59    // Objects are retained forever with this policy for a space.
60    kGcRetentionPolicyNeverCollect,
61    // Every GC cycle will attempt to collect objects in this space.
62    kGcRetentionPolicyAlwaysCollect,
63    // Objects will be considered for collection only in "full" GC cycles, ie faster partial
64    // collections won't scan these areas such as the Zygote.
65    kGcRetentionPolicyFullCollect,
66  };
  • kGcRetentionPolicyNeverCollect 表示Space空间不会进行GC
  • kGcRetentionPolicyAlwaysCollect 表示每次GC触发时都尝试进行垃圾回收
  • kGcRetentionPolicyFullCollect 表示只在FullGC 的情况下进行垃圾回收

每种类型的Space的功能可以查看:juejin.cn/post/713874...

ART中的Heap中使用了哪些呢?

c++ 复制代码
# /art/runtime/gc/heap.h

1336    // All-known continuous spaces, where objects lie within fixed bounds.
1337    std::vector<space::ContinuousSpace*> continuous_spaces_ GUARDED_BY(Locks::mutator_lock_);
1338  
1339    // All-known discontinuous spaces, where objects may be placed throughout virtual memory.
1340    std::vector<space::DiscontinuousSpace*> discontinuous_spaces_ GUARDED_BY(Locks::mutator_lock_);
1341  
1342    // All-known alloc spaces, where objects may be or have been allocated.
1343    std::vector<space::AllocSpace*> alloc_spaces_;
1344  
1345    // A space where non-movable objects are allocated, when compaction is enabled it contains
1346    // Classes, ArtMethods, ArtFields, and non moving objects.
1347    space::MallocSpace* non_moving_space_;
1348  
1349    // Space which we use for the kAllocatorTypeROSAlloc.
1350    space::RosAllocSpace* rosalloc_space_;
1351  
1352    // Space which we use for the kAllocatorTypeDlMalloc.
1353    space::DlMallocSpace* dlmalloc_space_;
1354  
1355    // The main space is the space which the GC copies to and from on process state updates. This
1356    // space is typically either the dlmalloc_space_ or the rosalloc_space_.
1357    space::MallocSpace* main_space_;
1358  
1359    // The large object space we are currently allocating into.
1360    space::LargeObjectSpace* large_object_space_;

具体可查看:juejin.cn/post/739464...

App进程中的Heap由5个Space构成:

  • Image space:用于将boot相关的.art.oat.vdex文件加载到内存中,其中的对象不可移动、不可回收。

  • Zygote space:zygote在第一次fork前会将main space和non-moving space中使用的对象规整到一起,成为zygote space,其中的对象不可移动、不可回收。

  • Non-moving space:DirectByteBuffer和早期的Bitmap,这类对象需要保证自己的内存不被移动,因为它的地址可能会被传递到native层使用。因此这类对象所处的空间称为non-moving space,其中的对象不可移动但可以被回收。

  • Large object space:它用于管理≥12KB的基本类型数组(譬如int[])和字符串对象(java.lang.String)。其中的对象不会引用其他对象,因此是引用关系链的末端。作为末端的节点,它们在三色标记中不会出现灰色的状态,因此可以省去一些中间辅助的数据和环节。其中的对象不可移动但可以被回收。

  • Main space:App堆内存分配的主要场所,其中的对象既可以被移动,也可以被回收。

堆内存分配

Allocator分配器枚举类型如下:

c++ 复制代码
# /art/runtime/gc/allocator_type.h

27  // Different types of allocators.
28  // Those marked with * have fast path entrypoints callable from generated code.
29  enum AllocatorType : char {
30    // BumpPointer spaces are currently only used for ZygoteSpace construction.
31    kAllocatorTypeBumpPointer,  // Use global CAS-based BumpPointer allocator. (*)
32    kAllocatorTypeTLAB,  // Use TLAB allocator within BumpPointer space. (*)
33    kAllocatorTypeRosAlloc,  // Use RosAlloc (segregated size, free list) allocator. (*)
34    kAllocatorTypeDlMalloc,  // Use dlmalloc (well-known C malloc) allocator. (*)
35    kAllocatorTypeNonMoving,  // Special allocator for non moving objects.
36    kAllocatorTypeLOS,  // Large object space.
37    // The following differ from the BumpPointer allocators primarily in that memory is
38    // allocated from multiple regions, instead of a single contiguous space.
39    kAllocatorTypeRegion,  // Use CAS-based contiguous bump-pointer allocation within a region. (*)
40    kAllocatorTypeRegionTLAB,  // Use region pieces as TLABs. Default for most small objects. (*)
41  };

根据分配器类型不同,以不同的方式为对象分配内存,分配过程详细可查看:juejin.cn/post/713874...

相关推荐
Think Spatial 空间思维几秒前
【实施指南】Android客户端HTTPS双向认证实施指南
android·网络协议·https·ssl
louisgeek1 小时前
Git 使用 SSH 连接
android
二流小码农1 小时前
鸿蒙开发:实现一个标题栏吸顶
android·ios·harmonyos
八月林城2 小时前
echarts在uniapp中使用安卓真机运行时无法显示的问题
android·uni-app·echarts
雨白2 小时前
搞懂 Fragment 的生命周期
android
casual_clover2 小时前
Android 之 kotlin语言学习笔记三(Kotlin-Java 互操作)
android·java·kotlin
梓仁沐白2 小时前
【Kotlin】数字&字符串&数组&集合
android·开发语言·kotlin
技术小甜甜2 小时前
【Godot】如何导出 Release 版本的安卓项目
android·游戏引擎·godot
火柴就是我3 小时前
Dart 原始字符串(Raw Strings)详解文档
android
玲小珑3 小时前
Auto.js 入门指南(五)实战项目——自动脚本
android·前端