CLR同步块地址

zzf*_*ima 6 c# heap clr

当我做:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并获取o1的内存(地址为0x022cf940):

在此输入图像描述

我意识到下面提到的几件事情:

  1. 绿色矩形是同步块,即12
  2. 蓝色矩形是4字节类型的地址
  3. 红色矩形是4字节整数,即3;

问题:同步块的空间在哪里,我该如何找到它?"12"代表什么?

Han*_*ant 13

同步块有多个用途.它可以存储Object.GetHashCode()的值,以便在再次调用GetHashCode()时,对象始终返回相同的哈希代码.它可以存储lock语句的所有者线程的ID .它有几个专用位,比如指示对象的终结器已经运行.并且它可以存储已分配的同步块的句柄,当线程同时调用GetHashCode 使用锁定且信息不再适合同步块时,这是必需的.它经过了微观优化.

您的情况很简单,只调用了,并且没有打开任何专用位.所以你看到锁的所有者,0x12 = 18是拥有锁的线程的Thread.ManagedThreadId.当你需要解决僵局时,这可以很方便.

右键单击窗口并选择"4字节整数"时,可以使调试器显示更容易解释.蓝色矩形是对象的方法表指针(也称为"类型句柄").它指示对象的类型,Object.GetType()使用它.红色矩形是对象开始存储其字段的位置.由于您的exp字段只有Int32,因此您可以看到3个字段.

  • 是的,这些是我所谈到的"专用位".Object.GetHashCode()不使用32位哈希码,它使用26位.没问题,你永远不会创建40亿个对象.如果您想了解更多信息,请单击"提问"按钮. (4认同)