这两种看了下art虚拟机的内存分配原理,在这儿简要的共享一下。 在art虚拟机里,保护了很多个空间分配内存,这些内存空间在art的源码里边被抽象成一个个Space方针。类之间的联系我从网上找了一下张图来表明,十分清晰:

Space依据内存空间是否接连分为两类:
- ContinuousSpace 内存空间接连,这儿首要代表有两种
- ImageSpace 这表明的是系统镜像的内存空间,咱们一般重视不到
- CntinuiusMemMapAllocSpace的几个子类,这些Space都是一些不同的内存分配战略,对应的则是虚拟机不同的GC战略。依据文档和一些网上能够查到的资料,咱们一般也就联系 RegionSpace 和 MallocSpace。
- DisContinuousSpace 内存空间不接连,首要代表便是 LargeObejctSpace(大方针)
小方针分配
小方针分配会依据咱们的GC收回算法来指定咱们的分配战略。详细的一个对应联系能够参阅我整理的这个图:

- KCollectorTypeCMS
- KCollectorTypeCC
这2个gc的算法核心还是仿制算法和符号铲除算法,同时支持了和程序并发运行。我找了两张图,回忆一下这两种算法:
- 仿制算法
仿制算法在收回内存空间的时分,收回器会把内存分为巨细持平的两部分,在gc发生的时分,会把存活的方针从源空间仿制到方针空间,仿制完毕后,一切的存活方针都排布在方针空间。然后把源空间悉数铲除。这是一个典型的空间换时间的战略。

- 符号铲除算法
符号铲除算法便是符号出需求收回的方针,符号完成之后一致进行收回。符号铲除的缺陷便是内存碎片空间会变多,在之后分配内存的时分简略在方针接连内存空间不行的时分触发频频gc。

回忆完 CMS 和CC,咱们持续看相关的分配战略,这儿别离对应了:
- KAllocatorTypeRegionTLAB、KAllocatorTypeRegion
- 这儿依据是否支持TLAB来决定,实测证明现在手机用的 KAllocatorTypeRegionTLAB,这个是高版别Android默许的小方针分配战略。
- KAllocatorTypeRosAlloc、KAllocatorTypeDlMalloc
- DlMalloc实际上内存分配便是用的C言语的malloc,在art虚拟机里,Google替换成了自己的 ROS (runs-of-slots) 算法,所以现在大部分运用场景是 ROS的
RegionAlloc
在heap的TryToAllocate函数里边,判别到 RegionAlloc:





RosAlloc
RosAlloc便是一个魔改版别的malloc,RosAlloc保护了一个Slot链表,每个Slot叫做Run,每个Slot有自己的内存size,能够灵敏分配。这个算法的长处便是内存分配精确,能减少碎片化,缺陷则是需求不适合分配大方针。关于RosAlloc的代码我就不分析了,感觉没什么必要,网上随意找个过程的图:


大方针分配
除了一般小方针,还有一个很重要的方针分配空间便是大方针了。



LargeObjectSpace有两种实现,别离是 FreeListSpace和 LargeObejctMapSpace:



- LargeObjectMapSpace

- FreeListSpace
FreeListSpace则是在初始化内存空间的时分,直接mmap了必定size的内存运用,然后给内存空间分页,这些页被保护在一个链表里边,内存分配的时分会先去查找有无地址和巨细相同的空间,有就会复用,没有的话就会拓荒新的页去进行分配。

-XX:HeapGrowthLimit=_
:

总结
简略总结了一下art虚拟机内存分配的原理,经过这些点咱们能够对安卓里这些java方针如何分配有一个简略的认知,对排查内存相关问题,研究一些内存性能优化方案树立一个根底。