簡體   English   中英

Android NDK:Dalvik Heap和Native Heap - 兩者之間的區別

[英]Android NDK: Dalvik Heap and Native Heap - How Separate Between the two

我知道在Android平台上有Dalvik(JVM)堆和Native堆。 Dalvik GC在本機堆上沒有工作。 但我不確定這是如何工作的,我的意思是Android操作系統是如何將它們分開的?

可能的情況1:由獨立的內存硬件組成(我不相信太多)

可能的情況2:Android操作系統對兩個堆都有固定的內存量

可能的情況3:Android OS必須在必要時將部分Dalvik內存堆分配為本機堆,因此本機堆和Dalvik堆的大小是靈活的。

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

本機堆由dlmalloc()管理,它使用mmap()和標准調用(如sbrk()來分配內存。 托管(“Dalvik”)堆(大部分)是使用mmap()分配的一個大塊。 它全部運行在Linux內核之上,所以如果您了解Linux內存管理,那么您已經知道了低級部件的工作原理。

您可以在本文中閱讀有關Dalvik如何將空頁從托管堆返回到操作系統的更多信息

編輯:有關Android內存管理信息的規范帖子就是這個 我不認為它直接回答你的問題,但它有很多很好的信息和信息網站的鏈接。

由於Android是開源的,您可以自己查看源代碼 看起來它調用create_mspace_with_base() 我不確定那是做什么的,但根據這篇文章 ,它從/dev/zero映射內存。

所以它真的是使用“獨立”堆。 它直接分配自己的內存頁面並自行管理。

這幾乎是你的第二種情況

有兩個單獨的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管理。 支持dlmallocrosalloc ,但ART使用rosalloc因為它更快。 與@fadden所說的(至少對於Lollipop)相比,這個區域由sbrk管理。 upwards

第二個區域,即2048頁長,它是本native heap 它由bionic庫使用,它是Android的libc實現。 dlmallocjemalloc都受支持,正在使用的那個取決於設備。 我還沒有找到擴展這個堆的調用,但我想mmap就足夠了。 downwards runtime ,朝向runtime堆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM