首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android NDK: Dalvik Heap和Native Heap -两者之间的区别

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

Stack Overflow用户
提问于 2014-02-03 13:11:55
回答 3查看 11.1K关注 0票数 16

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

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

可能的情况2: Android操作系统为两个堆提供固定数量的内存

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

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

EN

回答 3

Stack Overflow用户

发布于 2014-02-03 13:28:26

本机堆由dlmalloc()管理,它结合使用mmap()sbrk()等标准调用来分配内存。托管("Dalvik")堆(主要)是使用mmap()分配的一个大块。所有这些都运行在Linux内核之上,所以如果您了解Linux内存管理,那么您就已经知道底层部分是如何工作的了。

您可以阅读有关Dalvik如何在this post中将空页从托管堆返回到操作系统的更多信息。

关于内存管理信息的标准帖子是this one。我不认为它直接回答了你的问题,但它有很多好的信息和到信息丰富的网站的链接。

票数 10
EN

Stack Overflow用户

发布于 2014-02-03 13:29:25

因为Android是开源的,所以你可以使用check out the source code yourself。看起来它调用了create_mspace_with_base()。我不太确定这是做什么的,但根据this post的说法,它从/dev/zero映射内存。

所以它实际上是在使用一个“独立的”堆。它直接分配自己的内存页,并自行管理。

票数 3
EN

Stack Overflow用户

发布于 2015-05-26 18:06:32

这几乎是你的第二个案例了

有两个独立的heaps,一个用于runtime Art(以前称为DalvikVM),另一个用于native程序。

通过在proc文件系统的maps伪文件上执行cat,您可以很容易地看到这两个不同的区域。

考虑以下输出:

代码语言:javascript
复制
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所说的不同(至少对于棒棒糖来说),这个区域是由sbrk管理的。它会生长upwards

第二个区域,也就是2048 pages long,它是native heap。它由bionic库使用,该库是libc for Android的实现。dlmallocjemalloc都受支持,具体使用哪种取决于设备。我还没有找到扩展这个堆的调用,但我想mmap就足够了。它向runtime堆增长downwards

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21520110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档