Android NDK:Dalvik Heap和Native Heap - 两者之间的区别

时间:2014-02-03 05:11:55

标签: android memory android-ndk dalvik

我知道在Android平台上有Dalvik(JVM)堆和Native堆。 Dalvik GC在本机堆上没有工作。 但是我不确定这是如何工作的,我的意思是Android操作系统如何将它们分开?

可能的情况1:由单独的内存硬件组成(我不相信太多)

可能的情况2:Android OS为两个堆都有固定的内存量

可能的情况3:Android OS必须在必要时将部分Dalvik内存堆分配为本机堆,因此本机堆和Dalvik堆的大小是灵活的。

哪一个是真的,或者我没有提到的可能性?

3 个答案:

答案 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管理。支持dlmallocrosalloc,但ART使用rosalloc,因为它更快。与@fadden所说的(至少对于Lollipop)相比,这个区域由sbrk管理。它增长upwards

第二个区域,即2048页长,它是native heap。它由bionic库使用,该库是Android的libc实现。支持dlmallocjemalloc,并且正在使用它取决于设备。我没有找到扩展这个堆的调用,但我想mmap就足够了。它向downwards堆增长runtime