我正在使用
Microsoft SQL Server Enterprise:基于核心的许可(64位)版本 12.0.4100.1
我有一个代码可以创建许多非持久内存优化表,将它们用于某些事情,并在它们不再需要它们时丢弃它们。
然而,似乎丢弃的表仍在消耗RAM,因为如果我运行
SELECT pool_id, Name, min_memory_percent, max_memory_percent, max_memory_kb/1024 AS max_memory_mb,
used_memory_kb/1024 AS used_memory_mb, target_memory_kb/1024 AS target_memory_mb
FROM sys.dm_resource_governor_resource_pools
WHERE Name='InMemoryObjects'
我得到以下内容:
pool_id Name min_memory_percent max_memory_percent max_memory_mb used_memory_mb target_memory_mb
256 InMemoryObjects 50 50 380003 233239 380003
注意" used_memory_mb"专栏是。在我运行这个时,服务器中没有内存优化的表,所以我认为它必须是丢弃的内存优化表中的数据仍然以某种方式占用RAM。
同样,当我跑
时SELECT type, name, memory_node_id, pages_kb/1024 AS pages_MB
FROM sys.dm_os_memory_clerks WHERE type LIKE '%xtp%'
我得到以下输出:
type name memory_node_id pages_MB
MEMORYCLERK_XTP Default 0 1055
MEMORYCLERK_XTP DB_ID_19 0 6
MEMORYCLERK_XTP DB_ID_33 0 6
MEMORYCLERK_XTP DB_ID_41 0 56
MEMORYCLERK_XTP DB_ID_47 0 0
MEMORYCLERK_XTP DB_ID_32 0 233240
MEMORYCLERK_XTP Default 1 0
MEMORYCLERK_XTP Default 64 0
了解DB_ID_32如何占用相同的~240gb的RAM?
我需要一些方法来解决这个问题。当我运行多个代码实例时,我收到错误 "资源池中没有足够的系统内存' InMemoryObjects'运行此查询"。所以我认为这个记忆实际上必须被束缚,并且在它满满时不会自我释放。资源池' InMemoryObjects'是为这一个代码而制作的,除了这个代码创建的(并随后丢弃)之外,整个服务器中没有其他内存优化的对象。它创建的内存优化表都相当小(每个gb几个)。
我知道垃圾收集器应该每分钟运行一次,但是由于数据库中存在任何内存优化表,并且使用的内存根本没有减少,所以它已经过了一天。我已经尝试过强制垃圾收集,检查点,重置统计数据等,并且还没有能够恢复这些记忆。
我发现的唯一功能就是将整个数据库脱机并重新联机。但是每次运行代码时我都无法做到这一点,所以我需要一个更好的解决方案。
任何想法都会受到极大的赞赏。谢谢!
答案 0 :(得分:0)
我认为这可能是一个原因。但我很惊讶强制垃圾收集不会捡起来。从关于内存中垃圾收集的MSDN文档:
用户事务提交后,它会识别所有排队的项目 与它运行的调度程序相关联,然后释放内存。 如果调度程序上的垃圾收集队列为空,则进行搜索 对于当前NUMA节点中的任何非空队列。如果有低 交易活动和内存压力,主要 垃圾收集线程可以从任何访问垃圾收集行 队列。 如果之后没有交易活动(例如) 删除大量的行,没有内存压力, 在事务处理之前,删除的行不会被垃圾回收 活动恢复或有记忆压力。
https://msdn.microsoft.com/en-us/library/dn643768.aspx
可以尝试文件流垃圾回收吗?我想我在某处读过db必须具有的内存优化文件组使用文件流技术。不要引用我的话。