我得到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 = ¤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. */
}
Run Code Online (Sandbox Code Playgroud)
如您所见,只有在每个编译器分配了10个以上的竞技场页面时才会显示此消息.
实际上'竞技场'是什么?
你可以在这里或这里阅读.简而言之,它是多线程应用程序中内存管理的概念.记忆分为竞技场(区域,区域).每个分配竞技场都有自己的锁,因此多个线程在同时分配内存时不会相互干扰.
为什么我看到这条消息?我选择了一个吗?
不,我不这么认为.=)我不是很确定,但它似乎就像来自JIT的内部警告,它已经分配了大量的内存块.
在内部,这个基于竞技场的malloc建立在一个链表上.即每个竞技场都被实现为大块内存的链表.当前的block(currentArena)维护一个指向block()中下一个空闲位置的指针&(currentArena->ptr[currentArena->bytesAllocated]),如果该块被填充(参见<0>),则分配一个新的(见<1>)并添加到列表中(参见<2>).
| 归档时间: |
|
| 查看次数: |
5382 次 |
| 最近记录: |