Android NDK: куча Dalvik и родная куча - как отдельно между двумя
Я знаю, что куча Dalvik (JVM) и Родная куча на платформе Android.
И в Dalvik GC нет работы на родной куче.
Но я не уверен, как эта работа, я имею в виду, как ОС Android их разделяет?
Возможная ситуация 1: составлена с помощью отдельного аппаратного обеспечения памяти (я мало верю)
Возможная ситуация 2: ОС Android имеет FIXED количество памяти для кучи
Возможная ситуация 3: ОС Android должна выделять часть кучи памяти Dalvik, чтобы стать родной кучей, когда это необходимо, и поэтому размер нативной кучи и кучи Dalvik является гибким.
Какое из них истинно или возможность, о которой я не упоминал?
Ответы
Ответ 1
Нативная куча управляется dlmalloc()
, которая использует комбинацию mmap()
и стандартных вызовов, таких как sbrk()
для выделения памяти. Управляемая ( "Dalvik" ) куча (в основном) - один большой кусок, выделенный mmap()
. Все это работает поверх ядра Linux, поэтому, если вы понимаете управление памятью Linux, вы уже знаете, как работают детали нижнего уровня.
Вы можете узнать больше о том, как Dalvik возвращает пустые страницы из управляемой кучи в ОС в этом сообщении.
Изменить: канонический пост для информации об управлении памятью Android - этот. Я не думаю, что он напрямую отвечает на ваш вопрос, но он имеет много хорошей информации и ссылок на информационные сайты.
Ответ 2
Поскольку Android является открытым исходным кодом, вы можете проверить исходный код самостоятельно. Похоже, он называет create_mspace_with_base()
. Я не совсем уверен, что это делает, но согласно этот пост, он отображает память из /dev/zero
.
Таким образом, он действительно использует "отдельную" кучу. Он сам выделяет собственные страницы памяти и сам управляет этим.
Ответ 3
Это почти ваш второй случай
Существует 2 отдельных 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]
В приведенном выше примере первая область, длина которой составляет всего одну страницу, управляется ART Runtime
. Поддерживаются как dlmalloc
, так и rosalloc
, но Art
использует rosalloc
, поскольку он быстрее. Эта область, в отличие от того, что сказал @fadden (по крайней мере для Lollipop), управляется sbrk
. Он растет upwards
.
Вторая область, то есть 2048
страницы длинная, это native heap
. Он используется библиотекой bionic
, которая представляет собой реализацию libc
для Android. Поддерживаются как dlmalloc
, так и jemalloc
, и тот, который он используется, зависит от устройства. Я не нашел вызов, который расширяет эту кучу, но я думаю, mmap
хватит. Он растет downwards
, к куче runtime
.