studio more increasing code cache app allocate 2mb 256kb android memory android-ndk dalvik

android - more - increasing code cache capacity to 256kb



NDK de Android: Dalvik Heap y Native Heap-Cómo separarse entre los dos (3)

Sé que hay un montón de Dalvik (JVM) y un montón de Native en una plataforma Android. Y el Dalvik GC no tiene ningún trabajo en el montón nativo. Pero no estoy seguro de cómo funciona esto, quiero decir cómo los separa el sistema operativo Android.

posible situación 1: compuesta por hardware de memoria separado (no creo mucho)

posible situación 2: el sistema operativo Android tiene una cantidad FIJA de memoria para el montón

posible situación 3: el sistema operativo Android debe asignar parte del almacenamiento dinámico de Dalvik para que se convierta en almacenamiento dinámico nativo cuando sea necesario, por lo que el tamaño del almacenamiento dinámico nativo y el almacenamiento dinámico de Dalvik es flexible.

¿Cuál es verdad, o posibilidad que no mencioné?


Ya que Android es de código abierto, puedes revisar el código fuente tú mismo . Parece que llama a create_mspace_with_base() . No estoy exactamente seguro de lo que eso hace, pero de acuerdo con esta publicación , asigna memoria desde /dev/zero .

Así que realmente está usando un montón "separado". Asigna sus propias páginas de memoria directamente y lo gestiona.


Es casi tu segundo caso.

Hay 2 heaps separados, uno para el Art runtime (anteriormente DalvikVM ) y otro para los programas native .

Puede ver fácilmente estas dos áreas diferentes realizando un cat en el pseudoarchivo de maps del sistema de archivos proc .

Considere el siguiente resultado:

2a028000-2a029000 rw-p 00000000 00:00 0 [heap] b6400000-b6c00000 rw-p 00000000 00:00 0 [anon:libc_malloc]

En el ejemplo anterior, la primera área, que solo tiene 1 página, es administrada por el ART Runtime . Tanto dlmalloc como rosalloc son compatibles, pero ART utiliza rosalloc porque es más rápido. Esta área, en contraste con lo que dijo @fadden (al menos para Lollipop), es administrada por sbrk . Crece upwards .

La segunda área, que tiene 2048 páginas, es el native heap . Es utilizado por la biblioteca bionic , que es una implementación de libc para Android. Tanto dlmalloc como jemalloc son compatibles, y el que se está utilizando depende del dispositivo. No he encontrado una llamada que extienda este montón, pero supongo que mmap sería suficiente. Crece downwards , hacia el montón de runtime .


El montón nativo es administrado por dlmalloc() , que usa una combinación de mmap() y llamadas estándar como sbrk() para asignar memoria. El montón administrado ("Dalvik") es (en su mayoría) una gran parte asignada con mmap() . Todo se ejecuta sobre el kernel de Linux, por lo que si entiende la administración de memoria de Linux, entonces ya sabe cómo funcionan las piezas de nivel inferior.

Puede leer más sobre cómo Dalvik devuelve las páginas vacías del montón administrado al sistema operativo en esta publicación .

Edición: la publicación canónica de información sobre la administración de memoria de Android es esta . No creo que responda directamente a tu pregunta, pero tiene mucha información y enlaces a sitios informativos.