Как видно на прикрепленном изображении, общий размер кучи составляет менее 9 МБ, но использование памяти процессом составляет почти 22 ГБ. Это периодически возникающая ошибка, которую я не могу надежно воспроизвести, поэтому я пытаюсь решить проблему. На что мне нужно обратить внимание, чтобы отследить это использование? Какие инструменты я могу использовать, чтобы найти, где используется эта память?
Это длительный процесс, и проблема появляется каждые несколько дней, поэтому я не могу реально использовать инструмент, который сильно замедляет процесс, поскольку мне, возможно, придется ждать недели, чтобы воспроизвести проблему.
В настоящее время я обнаруживаю проблему с помощью PrivateMemorySize64
и оповещаю себя по электронной почте. Мне интересно, есть ли какие-либо библиотеки .NET, которые я могу использовать для тщательного анализа использования памяти, когда возникает проблема, чтобы сузить проблему?
Обновление - я использовал Debugdiag, чтобы сузить проблему, проблема, с которой я столкнулся сейчас, заключается в том, что я не уверен в том, на что смотрю.
Здесь это звучит плохо:
\clr.dll is responsible for 8.06 GBytes worth of outstanding allocations. The following are the top 2 memory consuming functions:
clr!EEHeapAllocInProcessHeap+46: 7.46 GBytes worth of outstanding allocations.
clr!CExecutionEngine::ClrVirtualAlloc+4f: 623.06 MBytes worth of outstanding allocations.
Глядя на функции по размеру выделения, неудивительно, что большая часть выделенной памяти вызвана выделением памяти.
clr!EEHeapAllocInProcessHeap+46 - 7.46 GBytes
Затем я просматриваю следы стека, чтобы попытаться выяснить, что происходит, но ни один из них не ссылается на какой-либо мой код, что, я думаю, не слишком удивительно, поскольку я предполагаю, что он не показывает управляемый код так куда мне идти отсюда?
Function details
Function clr!EEHeapAllocInProcessHeap+46
Source Line
Allocation type Heap allocation(s)
Heap handle 0x00000000`00000000
Allocation Count 1962310 allocation(s)
Allocation Size 7.46 GBytes
Leak Probability 12%
Call stack sample 1
Address 0x00000000`00000000
Allocation Time 00:05:42 since tracking started
Allocation Size 1.2 KBytes
LeakTrack+1f109
clr!EEHeapAllocInProcessHeap+46
clr!ThreadStore::AllocateOSContext+20
clr!ThreadSuspend::SuspendRuntime+1f2
clr!ThreadSuspend::SuspendEE+128
clr!WKS::GCHeap::GarbageCollectGeneration+b7
clr!WKS::gc_heap::trigger_gc_for_alloc+2d
clr!JIT_New+4d6
0x7FFC776370A1
Call stack sample 2
Address 0x00007ffc`d711d888
Allocation Time 00:05:59 since tracking started
Allocation Size 1.95 KBytes
LeakTrack+1f109
clr!EEHeapAllocInProcessHeap+46
clr!operator new+24
clr!SetupUnstartedThread+20
clr!ThreadNative::SetStart+c4
mscorlib_ni!System.Threading.Thread.SetStartHelper(System.Delegate, Int32)$##6003C20+138
0x7FFC7743DD30
Call stack sample 3
Address 0x00000000`00000000
Allocation Time 00:05:59 since tracking started
Allocation Size 1.2 KBytes
LeakTrack+1f109
clr!EEHeapAllocInProcessHeap+46
clr!operator new+24
clr!Thread::Thread+409
clr!SetupUnstartedThread+32
clr!ThreadNative::SetStart+c4
mscorlib_ni!System.Threading.Thread.SetStartHelper(System.Delegate, Int32)$##6003C20+138
0x7FFC7743DD30
Call stack sample 4
Address 0x00000040`00000000
Allocation Time 00:05:59 since tracking started
Allocation Size 16 Bytes
LeakTrack+1f109
clr!EEHeapAllocInProcessHeap+46
clr!operator new+24
clr!Thread::Thread+472
clr!SetupUnstartedThread+32
clr!ThreadNative::SetStart+c4
mscorlib_ni!System.Threading.Thread.SetStartHelper(System.Delegate, Int32)$##6003C20+138
0x7FFC7743DD30
Call stack sample 5
Address 0x00000000`00000000
Allocation Time 00:05:59 since tracking started
Allocation Size 520 Bytes
LeakTrack+1f109
clr!EEHeapAllocInProcessHeap+46
clr!operator new+24
clr!RCWStackHeader::RCWStackHeader+2b
clr!Thread::Thread+487
clr!SetupUnstartedThread+32
clr!ThreadNative::SetStart+c4
mscorlib_ni!System.Threading.Thread.SetStartHelper(System.Delegate, Int32)$##6003C20+138
0x7FFC7743DD30
Call stack sample 6
Address 0x00000000`00000000
Allocation Time 00:05:59 since tracking started
Allocation Size 24 Bytes
LeakTrack+1f109
clr!EEHeapAllocInProcessHeap+46
clr!Thread::InitThread+d9
clr!Thread::HasStarted+c1
clr!ThreadNative::KickOffThread+a7
clr!Thread::intermediateThreadProc+86
kernel32!BaseThreadInitThunk+14
ntdll!RtlUserThreadStart+21
Call stack sample 7
Address 0x00007ffc`d711d888
Allocation Time 00:05:59 since tracking started
Allocation Size 1.95 KBytes
LeakTrack+1f109
clr!EEHeapAllocInProcessHeap+46
clr!operator new+24
clr!SetupUnstartedThread+20
clr!ThreadNative::SetStart+c4
mscorlib_ni!System.Threading.Thread.SetStartHelper(System.Delegate, Int32)$##6003C20+138
0x7FFC77447620
Call stack sample 8
Address 0x00000000`00000000
Allocation Time 00:05:59 since tracking started
Allocation Size 520 Bytes
LeakTrack+1f109
clr!EEHeapAllocInProcessHeap+46
clr!operator new+24
clr!RCWStackHeader::RCWStackHeader+2b
clr!Thread::Thread+487
clr!SetupUnstartedThread+32
clr!ThreadNative::SetStart+c4
mscorlib_ni!System.Threading.Thread.SetStartHelper(System.Delegate, Int32)$##6003C20+138
0x7FFC77447620
Call stack sample 9
Address 0x00000231`fc8b24d0
Allocation Time 00:25:29 since tracking started
Allocation Size 3.99 KBytes
LeakTrack+1f109
clr!EEHeapAllocInProcessHeap+46
clr!operator new+24
clr!SyncBlockCache::GetNextFreeSyncBlock+6f
clr!ObjHeader::GetSyncBlock+6b
clr!JITutil_MonEnterWorker+da
0x7FFC7763317D
Call stack sample 10
Address 0x00000231`fc8ab460
Allocation Time 00:26:50 since tracking started
Allocation Size 3.99 KBytes
LeakTrack+1f109
clr!EEHeapAllocInProcessHeap+46
clr!operator new+24
clr!SyncBlockCache::GetNextFreeSyncBlock+6f
clr!ObjHeader::GetSyncBlock+6b
clr!JITutil_MonEnterWorker+da
0x7FFC7763317D