sys.dm_os_memory_objects (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

返回 SQL Server 当前分配的内存对象。 可以使用 sys.dm_os_memory_objects 分析内存使用情况,并确定可能的内存泄漏。

注意

若要从 Azure Synapse Analytics 或 Analytics 平台系统(PDW)调用此名称,请使用名称 sys.dm_pdw_nodes_os_memory_objects。 Azure Synapse Analytics 中的无服务器 SQL 池不支持此语法。

列名称 数据类型 描述
memory_object_address varbinary(8) 内存对象的地址。 不可为 null。
parent_address varbinary(8) 父内存对象的地址。 可以为 Null。
pages_allocated_count int 适用于:SQL Server 2008 (10.0.x) 至 SQL Server 2008 R2 (10.50.x)。

由该对象分配的页数。 不可为 null。
pages_in_bytes bigint 适用于:SQL Server 2012 (11.x) 及更高版本。

此内存对象实例分配的内存量(以字节为单位)。 不可为 null。
creation_options int 仅供内部使用。 可以为 Null。
bytes_used bigint 仅供内部使用。 可以为 Null。
type nvarchar(60) 内存对象的类型。

它指示该内存对象所属的特定组件,或指示内存对象的函数。 可以为 Null。
name varchar(128) 仅供内部使用。 Nullable。
memory_node_id smallint 该内存对象所用的内存节点的 ID。 不可为 null。
creation_time datetime 仅供内部使用。 可以为 Null。
max_pages_allocated_count int 适用于:SQL Server 2008 (10.0.x) 至 SQL Server 2008 R2 (10.50.x)。

由该内存对象分配的最大页数。 不可为 null。
page_size_in_bytes int 适用于:SQL Server 2012 (11.x) 及更高版本。

由该对象分配的页的大小(以字节为单位)。 不可为 null。
max_pages_in_bytes bigint 该内存对象曾经使用的最大内存量。 不可为 null。
page_allocator_address varbinary(8) 页分配器的内存地址。 不可为 null。 有关详细信息,请参阅 sys.dm_os_memory_clerks (Transact-SQL)
creation_stack_address varbinary(8) 仅供内部使用。 可以为 Null。
sequence_num int 仅供内部使用。 可以为 Null。
partition_type int 适用于:SQL Server 2016 (13.x) 及更高版本。

分区的类型:

0 - 不可分区内存对象

1 - 可分区内存对象,当前未分区

2 - 可分区内存对象,由 NUMA 节点分区。 在具有单个 NUMA 节点的环境中,这相当于 1。

3 - 可分区内存对象,按 CPU 进行分区。
contention_factor real 适用于:SQL Server 2016 (13.x) 及更高版本。

指定此内存对象的争用的值,0 表示无争用。 每当在该时间段内进行反映争用的指定数目的内存分配时,该值就会更新。 仅适用于线程安全的内存对象。
waiting_tasks_count bigint 适用于:SQL Server 2016 (13.x) 及更高版本。

此内存对象的等待数。 每当从此内存对象分配内存时,此计数器就会递增。 增量是当前等待访问此内存对象的任务数。 仅适用于线程安全的内存对象。 这是一个最佳努力值,没有正确性保证。
exclusive_access_count bigint 适用于:SQL Server 2016 (13.x) 及更高版本。

指定以独占方式访问此内存对象的频率。 仅适用于线程安全的内存对象。 这是一个最佳努力值,没有正确性保证。
pdw_node_id int 适用于:Azure Synapse Analytics、Analytics Platform System (PDW)

此分发所在节点的标识符。

partition_type、contention_factorwaiting_tasks_countexclusive_access_count尚未在SQL 数据库中实现。

权限

对于 SQL Server 和 SQL 托管实例,需要 VIEW SERVER STATE 权限。

在SQL 数据库基本、S0S1 服务目标以及弹性池中的数据库、服务器管理员帐户、Microsoft Entra 管理员帐户或服务器角色的成员##MS_ServerStateReader##身份是必需的。 对于所有其他 SQL 数据库服务目标,需要数据库的 VIEW DATABASE STATE 权限或 ##MS_ServerStateReader## 服务器角色中的成员身份。

SQL Server 2022 及更高版本的权限

要求对服务器具有 VIEW SERVER PERFORMANCE STATE 权限。

注解

内存对象是指多个堆。 它们所提供的分配的粒度比内存分配器所提供的分配的粒度更精细。 SQL Server 组件使用内存对象而不是内存 clerk。 内存对象使用内存分配器的页分配器接口来分配页。 内存对象不使用虚拟内存接口或共享内存接口。 根据分配模式的不同,组件可以创建不同的内存对象类型来分配任意大小的区域。

内存对象的典型页面大小为 8 知识库(KB)。 但是,增量内存对象的页大小的范围可以从 512 字节到 8 KB。

注意

页大小不是最大分配。 相反,页大小是受页分配器支持,并且由内存分配器实现的分配粒度。 可从内存对象中请求大于 8 KB 的分配。

示例

以下示例返回由每种内存对象类型分配的内存量。

SELECT SUM (pages_in_bytes) as 'Bytes Used', type   
FROM sys.dm_os_memory_objects  
GROUP BY type   
ORDER BY 'Bytes Used' DESC;  
GO  

另请参阅

与 SQL Server 操作系统相关的动态管理视图 (Transact-SQL)
sys.dm_os_memory_clerks (Transact-SQL)