Подтвердить что ты не робот

Всего страниц арены для JIT - что это значит?

Я получаю вывод logcat следующим образом:

02-12 20:06:18.515  11470-11470/? D/dalvikvm﹕ GC_EXTERNAL_ALLOC freed 3K, 48% free 3188K/6023K, external 7949K/8580K, paused 29ms
02-12 20:06:18.804  11470-11470/? D/dalvikvm﹕ GC_EXTERNAL_ALLOC freed <1K, 48% free 3189K/6023K, external 13255K/13400K, paused 28ms
02-12 20:06:19.406  11470-11470/? D/dalvikvm﹕ GC_EXTERNAL_ALLOC freed <1K, 48% free 3189K/6023K, external 14706K/16754K, paused 56ms
02-12 20:06:19.914  11470-11475/? I/dalvikvm﹕ Total arena pages for JIT: 11

Что означает "Total arena pages for JIT"?

4b9b3361

Ответ 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 = &currentArena->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 > ).

Ответ 2

Иногда удаление и повторная установка вашего приложения является хорошим решением. Работает для меня!