cmemthread wait
메모리의 과다한 소비로 인해 메모리가 없어 cmemthread 경합이 발생하는 경우
-- 전체 메모리 확인
SELECT cast(sum(pages_in_bytes)/1024./1024 as int) sizeMB, MO.TYPE, MC.TYPE
FROM SYS.DM_OS_MEMORY_OBJECTS MO
JOIN SYS.DM_OS_MEMORY_CLERKS MC
ON MO.PAGE_ALLOCATOR_ADDRESS=MC.PAGE_ALLOCATOR_ADDRESS
GROUP BY MO.TYPE, MC.TYPE
ORDER BY 1 DESC;
--MEMOBJ_MSXML 로 인한 메모리 사용량이 많다면, 아래 스크립트를 이용해 삭제 한다.
SELECT *
FROM sys.dm_os_memory_objects
WHERE type = 'MEMOBJ_MSXML';
-- 강제 삭제
declare @document_id int = 0
while (1=1)
begin
select top 1 @document_id = document_id from sys.dm_exec_xml_handles(0)
if @@rowcount = 0 break
EXEC SP_XML_REMOVEDOCUMENT @document_id
end
-- repro 를 위한 메모리 증가 쿼리
SET NOCOUNT ON
DECLARE @LOOP INT = 1
while (@LOOP <= 100000)
begin
DECLARE @message VARCHAR(MAX), @xDoc INT, @i INT = 0;
SET @message = (SELECT 'HellowWorld' '@Attribute1' FOR XML PATH('HelloWorld'));
PRINT @message;
EXEC sp_xml_preparedocument @xDoc OUTPUT, @message;
PRINT @xDoc;
SET @LOOP = @LOOP + 1
end