sys.dm_clr_appdomains (Transact-SQL)
針對伺服器中每一個應用程式定義域,各傳回一個資料列。 應用程式定義域 (AppDomain) 是 Microsoft .NET Framework Common Language Runtime (CLR) 中的一個建構,這是應用程式的隔離單元。 您可以利用此檢視來了解在 Microsoft SQL Server 中執行的 CLR 整合物件,並對其進行疑難排解。
CLR 整合 Managed 資料庫物件有多種類型。 如需有關這些物件的一般資訊,請參閱<使用 Common Language Runtime (CLR) 整合建立資料庫物件>。 每次執行這些物件時,SQL Server 都會建立 AppDomain,供其用來載入及執行必要的程式碼。 AppDomain 的隔離等級是每個擁有者每個資料庫各一個 AppDomain。 也就是說,使用者擁有的所有 CLR 物件一律在每個資料庫的相同 AppDomain 中執行 (如果使用者在不同的資料庫中註冊 CLR 資料庫物件,CLR 資料庫物件就會在不同的應用程式定義域中執行)。 程式碼執行完成之後,並不會終結 AppDomain, 而會將它快取到記憶體中,以供日後執行使用。 這樣可以提高執行效能。
如需詳細資訊,請參閱<應用程式網域>(英文)。
資料行名稱 |
資料類型 |
說明 |
---|---|---|
appdomain_address |
varbinary(8) |
AppDomain 的位址。 使用者擁有的所有 Managed 資料庫物件永遠都會載入相同的 AppDomain 中。 您可以使用這個資料行,在 sys.dm_clr_loaded_assemblies 中查閱目前已載入此 AppDomain 中的所有組件。 |
appdomain_id |
int |
AppDomain 的識別碼。 每個 AppDomain 都有一個唯一的識別碼。 |
appdomain_name |
varchar(386) |
SQL Server 指派的 AppDomain 名稱。 |
creation_time |
datetime |
建立 AppDomain 的時間。 由於系統會快取並重複使用 AppDomains 以提升效能,因此 creation_time 不一定時程式碼執行的時間。 |
db_id |
int |
建立這個 AppDomain 所在資料庫的識別碼。 儲存在兩個不同資料庫的程式碼不能共用同一個 AppDomain。 |
user_id |
int |
擁有可在此 AppDomain 中執行之物件的使用者識別碼。 |
狀態 |
nvarchar(128) |
AppDomain 目前狀態的描述項。 任一 AppDomain 在從建立到刪除的期間,都可以有不同的狀態。 請參閱本主題的<備註>一節,以取得詳細資訊。 |
strong_refcount |
int |
這個 AppDomain 的強式參考數目。 此數目反映目前正在使用此 AppDomain 執行的批次數目。 請注意,執行此檢視時會建立 strong refcount;即使目前並無正在執行的程式碼,strong_refcount 也會有 1 的值。 |
weak_refcount |
int |
這個 AppDomain 的弱式參考數目。 此數目指出 AppDomain 內快取的物件數目。 當您執行 Managed 資料庫物件時,SQL Server 會將物件快取到 AppDomain 內,以供日後使用。 這樣可以提高執行效能。 |
cost |
int |
AppDomain 的成本。 成本愈高,愈有可能因為記憶體壓力而卸載 AppDomain。 成本的高低通常需視重新建立此 AppDomain 所需的記憶體容量而定。 |
value |
int |
AppDomain 的值。 值愈低,愈有可能因為記憶體壓力而卸載此 AppDomain。 值的高低通常需視正在使用此 AppDomain 的連接或批次數目而定。 |
total_processor_time_ms |
bigint |
自處理序啟動以來,在目前應用程式定義域中執行之所有執行緒所用的處理器總時間 (以毫秒為單位)。 這相當於 System.AppDomain.MonitoringTotalProcessorTime。 |
total_allocated_memory_kb |
bigint |
自應用程式定義域建立以來,它所進行的所有記憶體配置總大小 (以 KB 為單位),不減去已回收的記憶體。 這相當於 System.AppDomain.MonitoringTotalAllocatedMemorySize。 |
survived_memory_kb |
bigint |
在上次完整區塊回收中存活下來且已知為目前應用程式定義域所參考的 KB 數。 這相當於 System.AppDomain.MonitoringSurvivedMemorySize。 |
備註
dm_clr_appdomains.appdomain_address 和 dm_clr_loaded_assemblies.appdomain_address 之間具有一對多關聯性。
下表列出可能的**「狀態」**值、它們的描述,以及在 AppDomain 週期中出現的時機。 您可以使用這些資訊來追蹤 AppDomain 的週期,以及監看可疑或重複的 AppDomain 執行個體卸載,而無需剖析 Windows 事件記錄檔。
AppDomain 初始化
狀態 |
說明 |
---|---|
E_APPDOMAIN_CREATING |
正在建立 AppDomain。 |
AppDomain 使用方式
狀態 |
說明 |
---|---|
E_APPDOMAIN_SHARED |
執行階段 AppDomain 已備妥,可供多位使用者使用。 |
E_APPDOMAIN_SINGLEUSER |
AppDomain 已備妥,可用於 DDL 作業中。 這些與 E_APPDOMAIN_SHARED 不同,因為共用的 AppDomains 是用於 CLR 整合執行,與 DDL 作業相反。 這類的 AppDomains 會與其他的並行作業隔離。 |
E_APPDOMAIN_DOOMED |
AppDomain 已排定卸載時程,但是其中目前有執行緒正在執行。 |
AppDomain 清除
狀態 |
說明 |
---|---|
E_APPDOMAIN_UNLOADING |
SQL Server 已要求 CLR 卸載 AppDomain,原因通常是包含 Managed 資料庫物件的組件已改變或卸除。 |
E_APPDOMAIN_UNLOADED |
CLR 已卸載 AppDomain。 這種狀態通常是因為使用者程式碼中有 ThreadAbort、OutOfMemory 或未處理的例外狀況而產生擴大程序的結果。 |
E_APPDOMAIN_ENQUEUE_DESTROY |
AppDomain 已在 CLR 中卸載,而且已設定為由 SQL Server 終止。 |
E_APPDOMAIN_DESTROY |
SQL Server 正在進行 AppDomain 的終結程序。 |
E_APPDOMAIN_ZOMBIE |
SQL Server 已終結 AppDomain,但尚未清除所有的 AppDomain 參考。 |
權限
需要資料庫的 VIEW SERVER STATE 權限。
範例
下列範例顯示如何檢視給定組件之 AppDomain 的詳細資料:
select appdomain_id, creation_time, db_id, user_id, state
from sys.dm_clr_appdomains a
where appdomain_address =
(select appdomain_address
from sys.dm_clr_loaded_assemblies
where assembly_id = 500)
下列範例顯示如何檢視給定 AppDomain 中的所有組件:
select a.name, a.assembly_id, a.permission_set_desc, a.is_visible, a.create_date, l.load_time
from sys.dm_clr_loaded_assemblies as l
inner join sys.assemblies as a
on l.assembly_id = a.assembly_id
where l.appdomain_address =
(select appdomain_address
from sys.dm_clr_appdomains
where appdomain_id = 15)