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



статическая компиляция (2)

Я получаю вывод 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

Что на самом деле означает «Всего страниц арены для JIT»?


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


Тайна ...
Меня это тоже заинтересовало, когда я впервые это увидел. Итак, я провел небольшое исследование. знак равно
Для начала позвольте мне уточнить, что такое «JIT». JIT означает компилятор Just-In-Time (он же динамический переводчик). Это часть dalvik, которая переводит байт-код в оптимизированный нативный код во время выполнения. Dalvik - это виртуальная машина процесса (ВМ) в операционной системе 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 страниц арены.

Что такое «арена»?
Вы можете прочитать об этом here или here . В нескольких словах, это концепция управления памятью в многопоточном приложении. Память делится на арены (регионы, районы). Каждая арена распределения имеет свою собственную блокировку, поэтому несколько потоков не мешают друг другу, когда они выделяют память одновременно.

Почему я увидел это сообщение? Я Избранный?
Нет, я так не думаю. =) Я не совсем уверен, но это похоже на внутреннее предупреждение от JIT о том, что он выделил большое количество блоков памяти.
Внутренне этот базируемый на арене malloc построен на связанном списке. Т.е. каждая арена реализована в виде связанного списка больших блоков памяти. Текущий блок ( currentArena ) поддерживает указатель на следующую свободную позицию в блоке ( &(currentArena->ptr[currentArena->bytesAllocated]) ), и, если блок заполнен (см. <0>), новый выделено (см. <1>) и добавлено в список (см. <2>).





android