Share via


SQL Server 2012 内存管理 (memory management) 改进

SQL Server 2012 的内存管理和以前的版本相比,有以下的一些变化。

一.内存分配器的变化

SQL Server 2012以前的版本,比如SQL Server 2008 R2等, 有single page allocator 和multi page allocator。 也就是说, 如果申请的内存是8k以内的, 就会有单页分配器分配,而大于8kb的内存请求,使用multi page 分配器来管理。所以,如果你运行DBCC MemoryStatus,你会发现这两个分配器分配的内存情况:

 

如果你查询memory clerk,也会发现single pages 和multi pages 两列:

select * from sys.dm_os_memory_clerks

而2012里面就不一样了,你会发现single page 和multi page字样消失了,只剩下pages 字样:

 

而下面的语句的输出也是不一样的:

select * from sys.dm_os_memory_clerks

 

 那么为什么会有这样的变化呢?原因就是SQL Server 2012里面不再有single page allocator 和multi page allocator,而是把它们统一起来了,叫做 any size page allocator。 下面的两张图可以看到这样的变化:

SQL Server 2008 R2:

SQL Server 2012:

 

从上面的图可以看出,SQL Server 2012 多了一个memory Manager,它来统一响应SQL Server 内部各种组件内存申请的请求。因为这个原因,在SQL Server 2012里面,max server memory 不再像以前的版本那样,只控制buffer pool的大小,也包括那些大于8kb 的内存请求。也就是, max server memory 能够更准确地控制SQL Server 的内存使用了。更多内存管理信息,可以参考:

 https://sqlblog.com/blogs/sqlos_team/archive/2012/07/12/memory-manager-configuration-changes-in-sql-server-2012.aspx