[英]For the HotSpot JIT, what does “already compiled into a big method” mean?
[英]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 = ¤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>)。
有時,卸載並重新安裝您的應用程序是一個很好的解決方案。 適合我!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.