androidndk:Dalvik堆和本机堆——两者之间的区别有多大

androidndk:Dalvik堆和本机堆——两者之间的区别有多大,android,memory,android-ndk,dalvik,Android,Memory,Android Ndk,Dalvik,我知道android平台中有Dalvik(JVM)堆和本机堆。 Dalvik GC在本机堆上没有工作。 但我不确定这是怎么回事,我是说Android操作系统是如何将它们分开的 可能的情况1:由单独的内存硬件组成(我不太相信) 可能的情况2:Android操作系统对两个堆都有固定的内存量 可能的情况3:Android操作系统必须在必要时分配部分Dalvik内存堆以成为本机堆,因此本机堆和Dalvik堆的大小是灵活的 哪一个是正确的,或者我没有提到的可能性?本机堆由dlmalloc()管理,它使用m

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

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

可能的情况2:Android操作系统对两个堆都有固定的内存量

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


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

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

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


编辑:有关Android内存管理信息的规范帖子是。我不认为它直接回答了你的问题,但它有很多好的信息和指向信息网站的链接。

因为Android是开源的,你可以。看起来它调用了
create\u mspace\u with_base()
。我不太清楚它到底是做什么的,但根据我的研究,它映射了
/dev/zero
中的内存


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

这几乎是第二种情况

有两个独立的
,一个用于
运行时
(以前的
DalvikVM
),另一个用于
本机程序

通过在
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运行时管理。支持
dlmalloc
rosalloc
,但
ART
使用
rosalloc
,因为它速度更快。与@fadden所说的相反(至少对于棒棒糖),这个区域是由
sbrk
管理的。它向上增长


第二个区域是
2048
页面长度,它是
本机堆
。它由
bionic
库使用,该库是针对Android的
libc
的实现。
dlmalloc
jemalloc
都受支持,并且它的使用取决于设备。我还没有找到扩展这个堆的调用,但我想
mmap
就足够了。它朝着运行时堆的方向向下扩展。

我不太了解Linux内存管理或Android操作系统的底层部分。你有介绍它的链接吗?我没有推荐的网站。在某种程度上,您的起点将取决于您对malloc/sbrk/mmap、虚拟内存的了解程度,以及您需要的答案的准确性。为了得到一个非常精确的答案,你需要阅读代码并理解它。对于一个不太精确的回答,我可以说,“堆是分开的,Dalvik堆大小是有上限的,本机堆没有固定的限制;Dalvik堆上限是每个进程,而不是每个设备”。你说本机堆没有限制,所以本机堆在需要更多内存空间时会使用Dalvik内存吗?(仍然处于不太精确的回答模式)否,如果请求太多,内存就会耗尽。我知道,但是当需要更多本机内存时,本机堆会不会占用分配给dalvik堆的内存空间?~“进程文件系统的映射伪文件上的cat”。什么是完整的命令
cat/proc/meminfo
cat/proc//maps
(将
替换为
self
将为您将要运行的cat命令提供映射文件)看起来[heap]vma不是由ART运行时管理的,fadden所说的ART运行时使用大量内存是正确的。