1

我一直在试图理解为什么我们会在 Citrix - Windows 10 下获得 OOM,尽管它没有发生在“普通”机器上。我们的应用程序混合了原生 C++、C# 和 Web 浏览器插件。容器是.net。

详细信息:Windows 10 版本 18363 MP(2 个过程)免费 x86 兼容产品:WinNt,套件:SingleUserTS 18362.1.wow64fre.19h1_release.190318-1202

2920000 730d0000   clr        (pdb symbols)          
    Loaded symbol image file: clr.dll
    Image path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
    Image name: clr.dll
    Browse all global symbols  functions  data
    Timestamp:        Wed Aug  5 03:06:56 2020 (5F2A0630)
    CheckSum:         007B81A2
    ImageSize:        007B0000
    File version:     4.8.4250.0
    Product version:  4.0.30319.0
    File flags:       8 (Mask 3F) Private
    File OS:          4 Unknown Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    Information from resource tables:
        CompanyName:      Microsoft Corporation
        ProductName:      Microsoft® .NET Framework
        InternalName:     clr.dll
        OriginalFilename: clr.dll
        ProductVersion:   4.8.4250.0
        FileVersion:      4.8.4250.0 built by: NET48REL1LAST_C
        PrivateBuild:     DDBLD342B
        FileDescription:  Microsoft .NET Runtime Common Language Runtime - WorkStation
        LegalCopyright:   © Microsoft Corporation.  All rights reserved.
        Comments:         Flavor=Retail

WinDbg 的异常

FAULTING_THREAD:  ffffffff

STACK_TEXT:  
011dd108 6e06611c PresentationCore_ni!System.Windows.Media.Imaging.BitmapSource.CreateCachedBitmap+0x47c


STACK_COMMAND:  !D:\WindDbg\windbg\x86\sym\SOS_x86_x86_4.8.4250.00.dll\5F2A06307b0000\SOS_x86_x86_4.8.4250.00.dll.pe 0x26b56e80 ; ** Pseudo Context ** ManagedPseudo ** Value: 12630c10 ** ; kb

MODULE_NAME: Unknown_Module

IMAGE_NAME:  Unknown_Image

FAILURE_BUCKET_ID:  CLR_EXCEPTION_System.OutOfMemoryException_8007000e_nexus.framework.healthcare.exe!unknown_error_in_process

OS_VERSION:  10.0.18362.1

BUILDLAB_STR:  19h1_release

OSPLATFORM_TYPE:  x86

OSNAME:  Windows 10

FAILURE_ID_HASH:  {196470ae-a638-36df-be48-e73b2df228f8}
 *** Followup info cannot be found !!! Please contact...

OOM 出现在 .Net 上,有时应用程序继续工作!其他时候,我在 taskmanager 上的内存使用量约为 700MB 时就遇到了异常,这真的很奇怪。

收到异常后,我设法在 taskmanager 上运行 PerfView 并强制执行 GC,将其从 > 750MB 降至 350MB。不知何故,我觉得 GC 在 Citrix 下没有按预期工作。

与开始相比,PerfView 实际上显示了非常少量的遗留对象。 性能视图差异

Vmap 还在堆上显示了许多 ~75MB 块 - 我猜这是来自 .Net,但是“?!?” 打扰我。我的猜测是基于我在 PerfView 上强制执行 GC 并且这些块已经消失的事实。此外,我在 WPA 中看到的 WPF 块的线大小与此相同?!?堵塞。这不可能是巧合。

地图

堆上几乎没有碎片: 堆碎片

我什至尝试使用 wpr 找出导致错误的原因,我可以看到 .net 上的 WPF 正在分配 ~75MB 块,这很奇怪?!?以及 - 我想这是 jitted 代码。我几乎有所有可用的符号,但仍然没有运气 - ?1?留在那里。也许 wpr 没有保存 .Net 信息 - 我需要尝试使用配置文件,但我无法一直访问计算机。

这是 WPA 的观点: WPF 块 奇怪的方块 Wpr

这是 Windbg 告诉我的关于内存的内容:

数据库

如您所见,.net 仅使用了大约 147MB 的部分,其余 200MB 我不确定。虚拟分配?我以为他们会进入堆部分。

保留的 200MB 也是一个大问题,我会试着找出它为什么会在那里。

dll 无法减少 - 我们都需要它们,特别是当用户同时打开许多插件时。

我想知道这是否是一个已知的 Citrix 问题。尽管我们仍然有 175 MB 可用空间,但我还能做些什么来检查为什么我们会得到这个 OOM?我想不出为什么我们的应用程序一次需要更多。我们没有显示大图片或视频。

我检查了 GDI/Handles/User 对象,一切似乎都还好。他们并不高。

我有但尚未尝试的一个想法是将 GC 设置更改为 Workstation - Concurrent 以查看会发生什么。不确定这是否会有所帮助。

这是堆栈:

0:000> k
 # ChildEBP RetAddr  
00 011dbd40 75def159 ntdll!NtWaitForSingleObject+0xc
01 011dbdb4 725e3370 KERNELBASE!WaitForSingleObjectEx+0x99
02 011dbde4 725e33cc clr!CLREventWaitHelper2+0x33
03 011dbe34 725e3319 clr!CLREventWaitHelper+0x2a
04 011dbe6c 725e333b clr!CLREventBase::WaitEx+0x14b
05 011dbe84 728d0125 clr!CLREventBase::Wait+0x1a
06 011dbef0 728d023a clr!Thread::WaitSuspendEventsHelper+0x8a
07 011dbf04 728ce36a clr!Thread::WaitSuspendEvents+0x14
08 011dbf1c 7267bcae clr!Thread::RareEnablePreemptiveGC+0x98
09 011dbf60 72b33ac5 clr!Thread::RareDisablePreemptiveGC+0x115
0a 011dbf84 72b2b333 clr!GCHolderEEInterface<0,1,1>::~GCHolderEEInterface<0,1,1>+0x61
0b 011dbfb8 72b2b4ea clr!Debugger::SendExceptionHelperAndBlock+0x133
0c 011dc030 72b2b86c clr!Debugger::SendExceptionEventsWorker+0x130
0d 011dc080 72b2b9d9 clr!Debugger::SendException+0x120
0e 011dc0a8 728841fa clr!Debugger::FirstChanceManagedException+0x19
0f 011dc0c4 726c15f4 clr!EEToDebuggerExceptionInterfaceWrapper::FirstChanceManagedException+0x31
10 011dc140 725e0754 clr!COMPlusThrowCallback+0x311
11 011dc40c 725e085a clr!Thread::StackWalkFramesEx+0x92
12 011dc740 726c1f01 clr!Thread::StackWalkFrames+0x9d
13 011dc8f0 726c238f clr!CPFH_RealFirstPassHandler+0x68e
14 011dc940 726c245a clr!CPFH_FirstPassHandler+0x119
15 011dc96c 72885fc7 clr!COMPlusFrameHandler+0x15d
16 011dc98c 770a8e72 clr!COMPlusFrameHandlerRevCom+0x17
17 011dc9b0 770a8e44 ntdll!ExecuteHandler2+0x26
18 011dca78 770942d6 ntdll!ExecuteHandler+0x24
19 011dca78 75e044c2 ntdll!KiUserExceptionDispatcher+0x26
1a 011dcf9c 726c28f0 KERNELBASE!RaiseException+0x62
1b 011dd038 726c3796 clr!RaiseTheExceptionInternalOnly+0x230
1c 011dd100 6e06611c clr!IL_Throw+0x146
WARNING: Stack unwind information not available. Following frames may be wrong.
1d 011dd1f0 6e04ff49 PresentationCore_ni+0x26611c
1e 011dd230 6e04feb2 PresentationCore_ni+0x24ff49
1f 011dd23c 6e04fe89 PresentationCore_ni+0x24feb2
20 011dd24c 6e04e3f0 PresentationCore_ni+0x24fe89
21 011dd390 6e04d910 PresentationCore_ni+0x24e3f0
22 011dd3cc 153582a3 PresentationCore_ni+0x24d910
23 011dd3dc 24be9b87 0x153582a3
24 011dd408 24be9a4d 0x24be9b87
25 011dd440 24be9986 0x24be9a4d
26 011dd458 24be96dd 0x24be9986
27 011dd470 1defd0c2 0x24be96dd
28 011dd4c4 1defcdb8 0x1defd0c2
29 011dd4d0 05de45c1 0x1defcdb8
2a 011dd51c 13ac31bb 0x5de45c1
2b 011dd52c 05de1fd8 0x13ac31bb
2c 011dd554 05de1e38 0x5de1fd8
2d 011dd56c 14a46136 0x5de1e38
2e 011dd588 14a46007 0x14a46136
2f 011dd5c0 725cf404 0x14a46007
30 011dd5e8 72694073 clr!COMToCLRDispatchHelper+0x6b
31 011dd644 0164e631 clr!COMToCLRWorker+0x4d5
32 011dd670 5b03e711 0x164e631
33 011dd6b0 5b03eeec NXIMFServer+0x7e711
34 011dd6f8 5afc480b NXIMFServer+0x7eeec
35 011dd79c 5b03aee0 NXIMFServer+0x480b
36 011dd82c 5b03ad7c NXIMFServer+0x7aee0
37 011dd8fc 5b03b147 NXIMFServer+0x7ad7c
38 011dd984 5b03cc47 NXIMFServer+0x7b147
39 011dd9bc 5b03afee NXIMFServer+0x7cc47
3a 011dda0c 760b829f NXIMFServer+0x7afee
3b 011dda34 7609a861 oleaut32!DispCallFunc+0x16f
3c 011ddcf8 76093e8d oleaut32!CTypeInfo2::Invoke+0x631
3d 011ddd24 5b013552 oleaut32!DispInvoke+0x2d
3e 011ddd4c 69f8e057 NXIMFServer+0x53552
3f 011dde10 69f8e45e mfc140!COleDispatchDriver::InvokeHelperV+0x227 [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\oledisp2.cpp @ 399] 
40 011dde30 25558ee1 mfc140!COleDispatchDriver::InvokeHelper+0x1e [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\oledisp2.cpp @ 557] 
41 011dde5c 25558e01 MFListManAX!DllUnregisterServer+0x3951
42 011ddeb8 25558a3d MFListManAX!DllUnregisterServer+0x3871
43 011dded0 69fbe19b MFListManAX!DllUnregisterServer+0x34ad
44 011ddfa0 69fbd9cd mfc140!CWnd::OnWndMsg+0x79b [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 2698] 
45 011ddfc4 69f2ade3 mfc140!CWnd::WindowProc+0x2d [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 2099] 
46 011ddfec 69fbbcd7 mfc140!COleControl::WindowProc+0x133 [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\ctlcore.cpp @ 1711] 
47 011de064 69fbbf24 mfc140!AfxCallWndProc+0xb7 [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 268] 
48 011de084 2556bf30 mfc140!AfxWndProc+0x34 [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 417] 
49 011de0c0 753345cb MFListManAX!DllUnregisterServer+0x169a0
4a 011de0ec 753150dc user32!_InternalCallWinProc+0x2b
4b 011de1d0 7531462f user32!UserCallWinProcCheckWow+0x3ac
4c 011de208 679fe787 user32!CallWindowProcW+0x7f
4d 011de230 725cf36d ToolkitPro1631vc140!CXTPSkinManagerApiHook::OnHookCallWindowProcW+0x77
4e 011de270 079a7957 clr!PInvokeStackImbalanceHelper+0x22
4f 011de2b8 079a787a 0x79a7957
50 011de2fc 14741f41 0x79a787a
51 011de330 079a65a9 0x14741f41
52 011de338 079a6580 0x79a65a9
53 011de34c 079a7a56 0x79a6580
54 011de388 14508f10 0x79a7a56
55 011de3bc 753345cb 0x14508f10
56 011de3e8 753150dc user32!_InternalCallWinProc+0x2b
57 011de4cc 7531488d user32!UserCallWinProcCheckWow+0x3ac
58 011de530 75329f7d user32!SendMessageWorker+0x1fd
59 011de560 2555d0d9 user32!SendMessageA+0x11d
5a 011de58c 28f95acf MFListManAX!DllUnregisterServer+0x7b49
5b 011de788 12c7e319 ML3001_2G!CMFListManagerGridView::OnLButtonDblClkRowCol+0x89f
5c 011de7c8 12c683eb GX6082VC140R!CGXControl::LButtonDblClk+0xb9
5d 011de860 12cda891 GX6082VC140R!CGXGridCore::DoLButtonDblClk+0x6cb
5e 011de878 69fbdf55 GX6082VC140R!CGXGridView::OnLButtonDblClk+0x21
5f 011de94c 69fbd9cd mfc140!CWnd::OnWndMsg+0x555 [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 2698] 
60 011de970 12cdb074 mfc140!CWnd::WindowProc+0x2d [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 2099] 
61 011de98c 69fbbcd7 GX6082VC140R!CGXGridView::WindowProc+0x44
62 011dea04 69fbbf24 mfc140!AfxCallWndProc+0xb7 [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 268] 
63 011dea24 2556bf30 mfc140!AfxWndProc+0x34 [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 417] 
64 011dea60 753345cb MFListManAX!DllUnregisterServer+0x169a0
65 011dea8c 753150dc user32!_InternalCallWinProc+0x2b
66 011deb70 7531422e user32!UserCallWinProcCheckWow+0x3ac
67 011debe4 75314010 user32!DispatchMessageWorker+0x20e
68 011debf0 725cf36d user32!DispatchMessageW+0x10
69 011dec20 6eb374f1 clr!PInvokeStackImbalanceHelper+0x22
6a 011dec5c 6eb1b3d7 WindowsBase_ni+0xf74f1
6b 011deca4 6eb1b319 WindowsBase_ni+0xdb3d7
6c 011decb0 68782ecc WindowsBase_ni+0xdb319
6d 011decc0 68782a8a PresentationFramework_ni+0x2c2ecc
6e 011dece0 6878287e PresentationFramework_ni+0x2c2a8a
6f 011ded00 14e8e234 PresentationFramework_ni+0x2c287e
70 011ded28 016e0dff 0x14e8e234
71 011ded58 725cf036 0x16e0dff
72 011ded64 725d22da clr!CallDescrWorkerInternal+0x34
73 011dedb8 725d859b clr!CallDescrWorkerWithHandler+0x6b
74 011dee2c 7277b11b clr!MethodDescCallSite::CallTargetWorker+0x16a
75 011def50 7277b7fa clr!RunMain+0x1b3
76 011df1bc 7277b727 clr!Assembly::ExecuteMainMethod+0xf7
77 011df6a0 7277b8a8 clr!SystemDomain::ExecuteMainMethod+0x5ef
78 011df6f8 7277b9ce clr!ExecuteEXE+0x4c
79 011df738 72777305 clr!_CorExeMainInternal+0xdc
7a 011df774 7420fa84 clr!_CorExeMain+0x4d
7b 011df7ac 7477e80e mscoreei!_CorExeMain+0xd6
7c 011df7bc 74784338 mscoree!ShellShim__CorExeMain+0x9e
7d 011df7c4 76d16359 mscoree!_CorExeMain_Exported+0x8
7e 011df7d4 77087c24 kernel32!BaseThreadInitThunk+0x19
7f 011df830 77087bf4 ntdll!__RtlUserThreadStart+0x2f
80 011df840 00000000 ntdll!_RtlUserThreadStart+0x1b

和线程:

0:000> !threads
ThreadCount:      11
UnstartedThread:  0
BackgroundThread: 10
PendingThread:    0
DeadThread:       0
Hosted Runtime:   no
                                                                         Lock  
       ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
   0    1 1fc8 0173da08     a6028 Preemptive  26B56FB0:00000000 01736698 1     STA System.OutOfMemoryException 26b56e80
   3    2 2c84 01782be0     2b228 Preemptive  00000000:00000000 01736698 0     MTA (Finalizer) 
   6    3 279c 06031fc8   102a228 Preemptive  00000000:00000000 01736698 0     MTA (Threadpool Worker) 
   9    6 2404 0801d028   202b228 Preemptive  00000000:00000000 01736698 1     MTA 
  28   10 2298 21eddb10   a029228 Preemptive  00000000:00000000 01736698 0     MTA (Threadpool Completion Port) 
  33    8 29d0 0608bde0   1029228 Preemptive  00000000:00000000 01736698 0     MTA (Threadpool Worker) 
  34    7 2d08 2c5f1f10   1029228 Preemptive  26B51A60:00000000 01736698 0     MTA (Threadpool Worker) 
  35    4 1db0 21eb39c8   1029228 Preemptive  00000000:00000000 01736698 0     MTA (Threadpool Worker) 
  36   11 2550 2bc2d008     a1228 Preemptive  00000000:00000000 01736698 0     Ukn 
  38    5  2a0 0d7d2090   8029228 Preemptive  00000000:00000000 01736698 0     MTA (Threadpool Completion Port) 
  39    9 2010 2c502b50   8029228 Preemptive  00000000:00000000 01736698 0     MTA (Threadpool Completion Port) 

********** 编辑 ********** 所以,我搜索了位图:

Statistics:
      MT    Count    TotalSize Class Name
6de2a780        1           12 System.Windows.Media.Imaging.BitmapCreateOptions
6de1144c        1           20 System.Windows.UncommonField`1[[System.Windows.Media.BitmapScalingMode, PresentationCore]]
6e796fdc        2           32 System.Windows.Media.Effects.BitmapEffectState
6de11368        2           40 System.Windows.UncommonField`1[[System.Windows.Media.Effects.BitmapEffectState, PresentationCore]]
6de20d8c        2           72 System.Windows.Media.Effects.DropShadowBitmapEffect
6de0e698        6           72 System.Windows.Media.BitmapScalingMode
6de2a748        7           84 System.Windows.Media.Imaging.BitmapCacheOption
6e7968f8        1          108 System.Windows.Media.Imaging.IconBitmapDecoder
6de202d8       15          300 System.Windows.Media.Imaging.BitmapPalette
6de2d9a4       19          304 System.Windows.Media.Imaging.BitmapSource+WeakBitmapSourceEventSink
6de217d4        4          432 System.Windows.Media.Imaging.JpegBitmapDecoder
6de20650        4          720 System.Windows.Media.Imaging.ColorConvertedBitmap
6de2d0e4       55          880 System.Collections.ObjectModel.ReadOnlyCollection`1[[System.Windows.Media.Imaging.BitmapFrame, PresentationCore]]
6de2d374       55          900 System.Windows.Media.Imaging.BitmapFrame[]
6de2d15c       55         1320 System.Collections.Generic.List`1[[System.Windows.Media.Imaging.BitmapFrame, PresentationCore]]
6de20434        9         1368 System.Windows.Media.Imaging.CachedBitmap
6de0a224       10         1400 System.Windows.Media.Imaging.UnmanagedBitmapWrapper
6de2cb5c      300         3600 System.Windows.Media.Imaging.BitmapInitialize
6de2200c       50         5400 System.Windows.Media.Imaging.PngBitmapDecoder
6de2d3e8      280         6720 System.Windows.Media.Imaging.BitmapSourceSafeMILHandle
6de2d22c       98        17640 System.Windows.Media.Imaging.BitmapFrameDecode
6de2a134      179        37232 System.Windows.Media.Imaging.BitmapImage
Total 1155 objects

我得到OOM的地方不一定是造成高内存使用的地方,但无论如何:

0:000> !pe
Exception object: 26b56e80
Exception type:   System.OutOfMemoryException
Message:          Nicht genügend Speicher verfügbar, um das Programm weiter auszuführen.
InnerException:   <none>
StackTrace (generated):
    SP       IP       Function
    011DD108 6E06611C PresentationCore_ni!System.Windows.Media.Imaging.BitmapSource.CreateCachedBitmap(System.Windows.Media.Imaging.BitmapFrame, System.Windows.Media.Imaging.BitmapSourceSafeMILHandle, System.Windows.Media.Imaging.BitmapCreateOptions, System.Windows.Media.Imaging.BitmapCacheOption, System.Windows.Media.Imaging.BitmapPalette)+0x47c

StackTraceString: <none>
HResult: 8007000e
0:000> .exr -1
*** WARNING: Unable to verify checksum for PresentationCore.ni.dll
ExceptionAddress: 6e06611c (PresentationCore_ni+0x0026611c)
   ExceptionCode: e0434f4d (CLR exception)
  ExceptionFlags: 00000000
NumberParameters: 0
0:000> !clrstack
OS Thread Id: 0x1fc8 (0)
Child SP       IP Call Site
011dd058 77091e4c [HelperMethodFrame: 011dd058] 
011dd108 6e06611c System.Windows.Media.Imaging.BitmapSource.CreateCachedBitmap(System.Windows.Media.Imaging.BitmapFrame, System.Windows.Media.Imaging.BitmapSourceSafeMILHandle, System.Windows.Media.Imaging.BitmapCreateOptions, System.Windows.Media.Imaging.BitmapCacheOption, System.Windows.Media.Imaging.BitmapPalette)
011dd204 6e04ff49 System.Windows.Media.Imaging.CachedBitmap.FinalizeCreation()
011dd238 6e04feb2 System.Windows.Media.Imaging.CachedBitmap.EndInit()
011dd244 6e04fe89 System.Windows.Media.Imaging.CachedBitmap..ctor(System.Windows.Media.Imaging.BitmapSource, System.Windows.Media.Imaging.BitmapCreateOptions, System.Windows.Media.Imaging.BitmapCacheOption)
011dd25c 6e04e3f0 System.Windows.Media.Imaging.BitmapImage.FinalizeCreation()
011dd398 6e04d910 System.Windows.Media.Imaging.BitmapImage.EndInit()

谢谢,马可

4

1 回答 1

1

OOM 出现在 .Net 上,有时应用程序继续工作

只有当

  • 异常被捕获并处理
  • 它发生在 UI 线程上,.NET 会显示一个对话框,无论您是否要继续

其他时候我已经在 ~700MB 内存使用量时遇到异常

a) 您可以在任何内存使用情况下获得 OOM 异常。“已经”不是这个OOM的科学方法。b) 什么是“内存使用”?您谈论虚拟内存、.NET 内存、本机内存、工作集大小、峰值工作集大小吗?请熟悉这些术语并使用正确的术语。理想情况下,还要命名您用于测量它的工具。

得到异常后,我设法运行 PerfView 并强制执行 GC,将其从 > 750MB 降低到 350MB。不知何故,我觉得 GC 在 Citrix 下没有按预期工作。

.NET 可能会决定随时进行垃圾收集。有时,它更喜欢在垃圾收集上运行计算。您可以强制进行垃圾收集并且内存减少的事实对我来说表明 GC 基本上可以工作。

与开始相比,PerfView 实际上显示了非常少量的遗留对象。

一个对象就足以解决内存泄漏。

Vmap还在堆上显示了许多~75MB的块——我猜这是来自.Net

是什么让您猜测这些来自 .NET?.NET 不使用堆管理器。它使用虚拟内存管理器。所以这些块很可能不是来自 .NET。

堆上几乎没有碎片

内存碎片可能是一个问题。但是为什么要关心原生堆内部的碎片呢?

这奇怪?!?以及 - 我想这是 jit 代码

是的,这很可能。

我几乎有所有可用的符号,但仍然没有运气 - ?1?留在那里。

符号不足以调试 .NET,而且大多数应用程序无法处理 .NET。对于 .NET,应用程序需要能够处理有关 .NET 工作方式的详细信息。对于 WinDbg,该逻辑编码在 WinDbg SOS 扩展中。MSCORDACWKS.DLL 中提供了内存管理详细信息

只要应用程序不要求您提供这些,它就可能不支持 .NET。

尽管我们仍有 175 MB 可用空间,但我还能做些什么来检查为什么我们会得到这个 OOM

如果您的应用程序想要一次分配 176 MB 的内存,那么 175 MB 是不够的。检查您的应用程序在崩溃时需要多少内存。

这是堆栈

为什么在这里使用本机堆栈命令而不是托管线程命令?

问题

在整篇文章中,我错过了托管内容和本地内容之间的区别。您正在将诸如k堆栈之类的本机命令与诸如!threads. 您正在使用本机命令!analyze而不是托管命令分析 .NET 异常!pe。您正在调查一个托管 OOM 异常,但同时您查看了本机堆的碎片。

如何调试

训练自己记忆如何协同工作。.NET 内存将是 .NET<unknown>列出的内存的一部分!address -summary。但是,其他一些库也将使用虚拟内存管理器,因此也被列为<unknown>. 位图是一个常见的例子。

要分析 .NET 内存,您需要使用来自 SOS 扩展的 .NET 特定命令。使用!dumpheap -stat!eeheap -gc。帮我们一个忙,不要将输出作为图像发布。用于.logopen获取文本输出。

为了更好地比较 .NET 内存,请使用擅长该方面的工具。WinDbg 不是。像 JetBains dotMemory 这样的工具适合这里。在这样的比较中,筛选出您知道需要处理的对象。

WinDbg 列出的堆是本机堆。这些通常来自 C++ 库。

仅仅因为您看到 .NET OOM 异常并不意味着 .NET 导致了它。您还可以查看内存的其他部分以避免 OOM:

  • 本机堆仍然是应用程序中最大的内存部分。为什么?您可能会在内存分配上设置断点并检查谁分配了 75 MB 块。
  • 为什么要加载 400 MB 的 DLL?你能摆脱一些吗?
  • 为什么有 200 MB 的保留内存?谁分配的?是什么原因?
于 2020-10-17T16:06:55.343 回答