我知道在Android平台上有Dalvik(JVM)堆和Native堆。 Dalvik GC在本机堆上没有工作。 但是我不确定这是如何工作的,我的意思是Android操作系统如何将它们分开?
可能的情况1:由单独的内存硬件组成(我不相信太多)
可能的情况2:Android OS为两个堆都有固定的内存量
可能的情况3:Android OS必须在必要时将部分Dalvik内存堆分配为本机堆,因此本机堆和Dalvik堆的大小是灵活的。
哪一个是真的,或者我没有提到的可能性?
答案 0 :(得分:9)
本机堆由dlmalloc()
管理,它使用mmap()
和sbrk()
等标准调用的组合来分配内存。托管(“Dalvik”)堆(大部分)是一个用mmap()
分配的大块。它全部运行在Linux内核之上,所以如果您了解Linux内存管理,那么您已经知道了低级部件的工作原理。
您可以在this post中详细了解Dalvik如何将空页从托管堆返回到操作系统。
编辑:有关Android内存管理信息的规范帖子为this one。我不认为它直接回答了你的问题,但它有很多很好的信息和链接到信息网站。
答案 1 :(得分:3)
由于Android是开源的,您可以check out the source code yourself。看起来它叫create_mspace_with_base()
。我不确定那是做什么的,但根据this post,它会从/dev/zero
映射内存。
所以它真的是使用“独立”堆。它直接分配自己的内存页面并自行管理。
答案 2 :(得分:3)
这几乎是你的第二个案例
有两个单独的heaps
,一个用于runtime
Art
(之前为DalvikVM
),另一个用于native
个程序。
通过在cat
文件系统的maps
伪文件上执行proc
,您可以轻松查看这两个不同的区域。
考虑以下输出:
2a028000-2a029000 rw-p 00000000 00:00 0 [heap]
b6400000-b6c00000 rw-p 00000000 00:00 0 [anon:libc_malloc]
在上面的例子中,第一个区域只有1页长,由ART Runtime
管理。支持dlmalloc
和rosalloc
,但ART
使用rosalloc
,因为它更快。与@fadden所说的(至少对于Lollipop)相比,这个区域由sbrk
管理。它增长upwards
。
第二个区域,即2048
页长,它是native heap
。它由bionic
库使用,该库是Android的libc
实现。支持dlmalloc
和jemalloc
,并且正在使用它取决于设备。我没有找到扩展这个堆的调用,但我想mmap
就足够了。它向downwards
堆增长runtime
。