【发布时间】:2015-08-21 20:03:57
【问题描述】:
当我这样做时:
public class Employee
{
public int exp;
}
class Program
{
static void Main(string[] args)
{
Employee o1 = new Employee();
o1.exp = 3;
lock (o1)
{
//I am here
}
}
}
并获取o1的内存(地址为0x022cf940):
我意识到下面提到的几件事:
- 绿色矩形为同步块,为12
- 蓝色矩形是4字节地址类型
- 红色矩形为4字节整数,即3;
问题:同步块的空间在哪里,如何找到它? “12”代表什么?
【问题讨论】:
-
您的图像表明这是一个 32 位系统。绿色矩形是您的 Syncblk,值为 12(以及标志 BIT_SBLK_IS_HASH_OR_SYNCBLKINDEX = 0x08000000),蓝色是您的 TypeHandle,红色是您的 exp 字段的值。您是在问我们在哪里可以找到 Syncblk 条目表? msdn.microsoft.com/en-us/magazine/cc163791.aspx#S7
-
也许 syncblk.h 代码会有所帮助? github.com/dotnet/coreclr/blob/master/src/vm/syncblk.h
-
值 (0x12) 是可移动表的索引。该表的位置只是 CLR 关心的问题,程序员不需要知道。因此没有 API 可以找到。
-
Henk Holterman - 正如 Hans Passant 所说,是 System.Threading.Thread.CurrentThread.ManagedThreadId。
标签: c# heap-memory clr