Usando os Memory Objects
Tudo começou com a discussão de XML.
Memory Leak usando OPENXML
https://blogs.msdn.com/b/fcatae/archive/2014/02/18/sp-xml-preparedocument-leak.aspx
Existem duas procedures:
- sp_xml_preparedocument
- sp_xml_removedocument
A primeira serve para reservar a memória para o documento, enquanto que a segunda libera o recurso. Existe uma forma de causar um Memory Leak chamando várias vezes a procedure de “prepare” e esquecendo de liberar a memória com “remove”.
Em todos os problemas de alto consumo de memória, recomendo que utilize a monitoração de Memory Clerk.
Monitorando Memória com os Clerks
https://blogs.msdn.com/b/fcatae/archive/2014/02/25/monitorando-memoria.aspx
Se mesmo assim não for possível descobrir, podemos acompanhar o consumo de memória através dos MemObj.
Cada Memory Clerk é composto por uma série de alocações feitas pelo subcomponente chamado MemObj. Experimente rodar a query abaixo:
select *
from sys.dm_os_memory_objects mo join
sys.dm_os_memory_clerks mc
on mo.page_allocator_address = mc.page_allocator_address
where mc.type = 'MEMORYCLERK_SQLGENERAL'
order by pages_in_bytes desc
Na query exemplo, estamos procurando os MemObj responsáveis pelo alto consumo do Memory Clerk.
O resultado apresenta os principais subconsumidores de memória:
Agora podemos afirmar com 100% de certeza que o principal responsável é o MEMOBJ_MSXML. Sim – o problema de Memory Leak foi causado pelo XML!