<code root>/dalvik/vm/Sync.cpp
中的,有一个struct Monitor
:
struct Monitor {
Thread* owner; /* which thread currently owns the lock? */
int lockCount; /* owner's recursive lock depth */
Object* obj; /* what object are we part of [debug only] */
Thread* waitSet; /* threads currently waiting on this monitor */
pthread_mutex_t lock;
Monitor* next;
/*
* Who last acquired this monitor, when lock sampling is enabled.
* Even when enabled, ownerMethod may be NULL.
*/
const Method* ownerMethod;
u4 ownerPc;
};
我无法理解为什么Monitor
与8个字节对齐。我认为它应该对齐4个字节,因为其中的所有成员(即指针,int
和pthread_mutex_t
)的长度为4个字节。
答案 0 :(得分:3)
问题没有明确显示,但是通过8字节对齐,您可能意味着code的这一部分,Misaligned monitor
检查:
Monitor* dvmCreateMonitor(Object* obj)
{
Monitor* mon;
mon = (Monitor*) calloc(1, sizeof(Monitor));
if (mon == NULL) {
ALOGE("Unable to allocate monitor");
dvmAbort();
}
if (((u4)mon & 7) != 0) {
ALOGE("Misaligned monitor: %p", mon);
dvmAbort();
}
原因是Dalvik使用薄锁定。锁是对象的32位值,底部3位用于编码锁状态:一位用于瘦/胖锁状态,两位用于散列状态。指向Monitor
本身的指针只剩下29位。
来自同一个source:
锁定值本身存储在Object.lock中。 LSB的 锁定其状态。清除后,锁定在“薄” state及其位的格式如下:
[31 ---- 19] [18 ---- 3] [2 ---- 1] [0]
lock count thread id hash state 0
设置后,锁定处于“胖”状态并且其位被格式化 如下:
[31 ---- 3] [2 ---- 1] [0]
pointer hash state 1
供参考,以下是描述精简锁定的文章:Thin Locks: Featherweight Synchronization for Java
在评论中,您询问如何完成对齐。 C标准只需要分配器返回一个可以在任何类型的赋值中使用的地址。从C99§7.20.3(内存管理功能):
如果分配成功,则返回指针,以便将其分配给指向任何类型对象的指针,然后用于在分配的空间中访问此类对象或此类对象的数组(直到空格为明确解除分配)。
默认情况下,32位ARM系统上的malloc/calloc/realloc
返回8字节对齐的块。我相信Misaligned monitor
检查就像防御代码一样快速失败,以防分配器被替换为不返回8字节对齐块的版本。