JIT的竞技场总页数 - 这是什么意思?

ezp*_*sso 22 java android

我得到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
Run Code Online (Sandbox Code Playgroud)

"JIT的总体竞技场页面"真正意味着什么?

naX*_*aXa 31

神秘......
当我第一次看到它时,我也很感兴趣.所以我做了一点研究.=)
首先,让我澄清什么是'JIT'.JIT代表Just-In-Time编译器(又名动态转换器).它是dalvik的一部分,它在运行时将字节代码转换为优化的本机代码.Dalvik是Android操作系统中的流程虚拟机(VM),用于执行为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. */
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,只有在每个编译器分配了10个以上的竞技场页面时才会显示此消息.

实际上'竞技场'是什么?
你可以在这里这里阅读.简而言之,它是多线程应用程序中内存管理的概念.记忆分为竞技场(区域,区域).每个分配竞技场都有自己的锁,因此多个线程在同时分配内存时不会相互干扰.

为什么我看到这条消息?我选择了一个吗?
不,我不这么认为.=)我不是很确定,但它似乎就像来自JIT的内部警告,它已经分配了大量的内存块.
在内部,这个基于竞技场的malloc建立在一个链表上.即每个竞技场都被实现为大块内存的链表.当前的block(currentArena)维护一个指向block()中下一个空闲位置的指针&(currentArena->ptr[currentArena->bytesAllocated]),如果该块被填充(参见<0>),则分配一个新的(见<1>)并添加到列表中(参见<2>).