Dot-Net

在堆上分配的對象

  • November 16, 2021

每當創建任何新對象時,都會在堆上創建該對象。為每個對象分配的記憶體有兩個附加欄位 1) 類型對象指針 2) 同步塊索引。

這兩個欄位的具體用途是什麼。任何人都可以闡明這一點嗎?

類型對象指針用於表示對象的類型。這是必需的:

  • 方法查找(vtable)
  • 檢查演員表
  • 如果Type您呼叫GetType.

syncblock 欄位主要用於鎖定。它只在需要時才被填充,並且當一個鎖始終沒有爭議時,CLR 會使用不需要任何外部數據的“瘦”鎖。否則,它是程序範圍表中的一個條目——我不知道表中的詳細資訊,但我想它就像一個等待對象監視器的執行緒列表。當然,最重要的資訊是目前是否持有鎖、由哪個執行緒持有以及它的計數是多少(由於 .NET 鎖的可重入性)。

如果您呼叫同步塊GetHashCode()並且它沒有被覆蓋,它也會被填充 - 它使用程序範圍的表來分配一個穩定的數字,基本上。(對象的地址不夠好,因為它會隨著時間而改變。)

引用自:https://stackoverflow.com/questions/1629100