Ответ 1
Тайна...
Меня это тоже интересовало, когда я впервые увидел это. Поэтому я провел небольшое исследование. =)
Для начала позвольте мне уточнить, что такое "JIT". JIT - это компилятор Just-In-Time (он же динамический переводчик). Это часть dalvik, которая преобразует байтовый код в оптимизированный собственный код во время выполнения. Dalvik - это виртуальная машина процесса (VM) в операционной системе Android, которая выполняет приложения, написанные для Android.
Я нашел из источники dalvik, что строка "Total arena pages for JIT"
может быть встречена только в одном классе - Utility
из 'dalvik\vm\compiler', Вот короткая часть его кода:
/* Arena-based malloc for compilation tasks */
void * dvmCompilerNew(size_t size, bool zero)
{
/* edit: some code omitted. */
retry:
/* Normal case - space is available in the current page */
if (size + currentArena->bytesAllocated <= currentArena->blockSize) {
void *ptr;
ptr = ¤tArena->ptr[currentArena->bytesAllocated];
currentArena->bytesAllocated += size;
/* edit: some code omitted. */
} else { // <0>
/*
* See if there are previously allocated arena blocks before the last
* reset
*/
/* edit: some code omitted. */
/* Time to allocate a new arena */
ArenaMemBlock *newArena = (ArenaMemBlock *)
malloc(sizeof(ArenaMemBlock) + blockSize); // <1>
if (newArena == NULL) {
ALOGE("Arena allocation failure");
dvmAbort();
}
newArena->blockSize = blockSize;
newArena->bytesAllocated = 0;
newArena->next = NULL;
currentArena->next = newArena; // <2>
currentArena = newArena;
numArenaBlocks++;
if (numArenaBlocks > 10)
ALOGI("Total arena pages for JIT: %d", numArenaBlocks);
goto retry;
}
/* edit: some code omitted. */
}
Как вы можете видеть, это сообщение появляется только в том случае, если на компилятор было выделено более 10 страниц арены.
Что такое "арена"?
Вы можете прочитать об этом здесь или здесь. В нескольких словах это концепция управления памятью в многопоточном приложении. Память разделена на арены (регионы, районы). Каждая арена распределения имеет свою собственную блокировку, поэтому несколько потоков не мешают друг другу, когда они распределяют память одновременно.
Почему я увидел это сообщение? Я Избранный?
Нет, я так не думаю. =) Я не уверен, но похоже, что это внутреннее предупреждение от JIT, что оно выделило большое количество блоков памяти.
Внутренне это malloc на основе арены построено на связанном списке. То есть каждая арена реализована как связанный список больших блоков памяти. Текущий блок (currentArena
) поддерживает указатель на следующую свободную позицию в блоке (&(currentArena->ptr[currentArena->bytesAllocated])
), и если блок заполнен (см. < 0 > ), выделяется новый (см. < 1 > ) и добавляется в список (см. < 2 > ).