我知道android平台中有Dalvik(JVM)堆和Native堆。Dalvik GC在本机堆上没有任何工作。但我不确定这是如何工作的,我的意思是Android操作系统是如何将它们分开的?
可能的情况1:由独立的内存硬件组成(我不太相信)
可能的情况2: Android操作系统为两个堆提供固定数量的内存
可能的情况3: Android操作系统必须在必要时分配部分Dalvik内存堆成为本机堆,因此本机堆和Dalvik堆的大小是灵活的。
哪一个是真的,或者是我没有提到的可能性?
发布于 2014-02-03 13:28:26
发布于 2014-02-03 13:29:25
因为Android是开源的,所以你可以使用check out the source code yourself。看起来它调用了create_mspace_with_base()。我不太确定这是做什么的,但根据this post的说法,它从/dev/zero映射内存。
所以它实际上是在使用一个“独立的”堆。它直接分配自己的内存页,并自行管理。
发布于 2015-05-26 18:06:32
这几乎是你的第二个案例了
有两个独立的heaps,一个用于runtime Art(以前称为DalvikVM),另一个用于native程序。
通过在proc文件系统的maps伪文件上执行cat,您可以很容易地看到这两个不同的区域。
考虑以下输出:
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所说的不同(至少对于棒棒糖来说),这个区域是由sbrk管理的。它会生长upwards。
第二个区域,也就是2048 pages long,它是native heap。它由bionic库使用,该库是libc for Android的实现。dlmalloc和jemalloc都受支持,具体使用哪种取决于设备。我还没有找到扩展这个堆的调用,但我想mmap就足够了。它向runtime堆增长downwards。
https://stackoverflow.com/questions/21520110
复制相似问题