簡體   English   中英

JIT的競技場總頁數 - 這是什么意思?

[英]Total arena pages for JIT - what does it mean?

我得到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操作系統中的流程虛擬機(VM),用於執行為Android編寫的應用程序。
我從dalvik的消息來源發現字符串"Total arena pages for JIT"只能在一個類中實現 - 來自'dalvik \\ vm \\ compiler'的Utility 這是它的一小段代碼:


    /* 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>)。

有時,卸載並重新安裝您的應用程序是一個很好的解決方案。 適合我!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM