本故障排除指南提供了诊断和解决应用程序中内存消耗过高问题的步骤,重点介绍涉及内存泄漏的方案。 它可帮助你了解典型症状、不同系统配置中与内存使用量相关的限制,以及有效诊断问题所需的工具。
数据捕获工具
备注
- 避免使用任务管理器收集内存转储。 调试调试和 Procdump 等专用工具对于 ASP.NET 应用程序更有效,因为它们更好地了解托管代码并自动处理进程位。
- 可能需要多次尝试才能获取一组有用的内存转储。
- 确保有足够的磁盘空间用于内存转储。 每个转储大约是当时进程的大小。 例如,如果进程为 1 千兆字节(GB),则生成三个转储需要大约 4 GB 的空间。
不同方案的内存限制
内存泄漏通常会导致内存使用量稳步增加,导致崩溃或性能下降:
备注
内存使用率高并不总是指示泄漏;如果稍后释放分配的内存,进程可能会恢复。 内存泄漏是由应用程序中的一个或多个 bug 导致的,其中分配永远不会释放。
-
32 位应用程序:32 位应用程序在内存不足时可能会崩溃并引发
OutOfMemory
异常,可能在崩溃前不报告错误。 如果在应用程序代码中未正确处理内存分配失败,它们的行为可能不可预知。 - 64 位应用程序:由于地址空间较大,尝试分配虚拟内存时,64 位应用程序很少失败。 但是,它们可能会增大为具有非常大的虚拟地址空间,并导致物理内存的分页过多,这会影响应用程序和其他争用物理内存的应用程序。
场景 | 内存限制 | 详细信息 |
---|---|---|
32 位 Windows 上的 32 位应用程序 | 总共 4 GB(用户模式下为 2 GB,内核模式下为 2 GB) | 如果在 32 位应用程序中使用 /LARGEADDRESSAWARE 标志,并在启动期间在操作系统的 boot.ini 文件中使用 /3GB 开关,则会使用户模式内存为 3 GB,内核模式为 1 GB。 |
64 位 Windows 上的 32 位应用程序 | 总共 4 GB(用户模式下为 2 GB,内核模式下为 2 GB) | 如果在 32 位应用程序中使用 /LARGEADDRESSAWARE 标志,则会使用户模式内存为 4 GB。 内核不使用 64 位操作系统上的 32 位地址空间。 它仅使用 64 位地址空间中的所需空间。 |
64 位 Windows 上的 64 位应用程序 | 2^64 字节 = 16 个 Exabyte (EB) (约 100 克罗 GB)。 但是,Windows10 x 64 支持 48 位虚拟地址:2^48 字节 = 256 TB(在用户模式下为 128 TB,内核模式下为 128 TB)。 | NA |
32 位 Windows 上的 64 位应用程序 | 无效方案 | NA |
识别高内存使用率
识别高内存使用率的最简单方法是使用 Internet Information Services (IIS) 管理器的辅助进程模块监视专用字节(KB)计数器。 专用字节(KB)计数器指示进程使用的专用提交内存量。
若要监视 专用字节(KB),请执行以下步骤:
打开“IIS 管理器”。
选择服务器名称(左侧)。
双击“ 工作进程”。
检查专用字节数(KB)。 下面是屏幕截图:
如果w3wp.exe进程(IIS 工作进程)的专用字节(KB)值达到内存限制,如不同方案的内存限制中所述,w3wp.exe进程存在较高的内存问题。 进程 ID 和应用程序池名称显示在它旁边。 可能需要手动刷新此视图。
确定内存泄漏是托管还是本机
确认w3wp.exe进程内存使用率较高后,下一步是确定它是托管内存还是本机内存泄漏。 按照以下步骤确定内存泄漏的类型:
打开性能监视器并选择+要添加计数器的图标。
选择 .NET CLR 内存计数器下所有堆中的 #字节数,选择目标进程(此处为 w3wp),然后选择“添加”。
选择进程计数器下的专用字节和虚拟字节,选择目标进程,然后选择“添加”(可以忽略工作集)。
选择“确定”。
重现此问题。
若要验证它是托管内存还是本机内存泄漏,请监视计数器:
托管内存泄漏:如果专用字节计数器和虚拟字节计数器以相同的速率增加(它们之间的差异保持不变),则表示托管内存泄漏。
本机内存泄漏:如果 专用字节 计数器增加,但 所有堆 计数器中的 #字节数保持不变,则表示本机内存泄漏。
数据收集
确认内存泄漏类型后,下一步是使用工具在高内存使用率事件期间收集进程的内存转储。 这些转储可以帮助你分析和诊断问题的原因。
- 若要收集托管内存泄漏的转储,请参阅 托管内存泄漏的数据捕获。
- 若要收集本机内存泄漏的转储,请参阅 排查 IIS 7.x 应用程序池中的本机内存泄漏问题。
.NET Core 应用程序
如果相关应用程序为 .NET Core 并在进程内模式下托管在 IIS 上,请使用数据捕获中的 数据收集步骤进行托管内存泄漏。 但是,如果应用程序托管在进程外模式下的 IIS 上,请修改操作以调查 dotnet 进程 dotnet.exe(除非另有指定),而不是w3wp.exe。 这同样适用于自承载 .NET Core 应用程序。
故障排除示例
假设你在 IIS 服务器上托管了一个应用程序,并在访问特定 URL 时遇到高内存使用率(通过执行压力测试,内存峰值高达 7 GB),请按照以下步骤诊断问题:
按照“确定内存泄漏是托管还是本机”中的步骤检查性能监视器。 如果注意到专用字节和虚拟字节之间的差异保持不变,则这是托管内存泄漏。
按照使用 DebugDiag 中所述的步骤收集转储文件。
在 WinDbg 中打开转储文件。 对于高内存方案,可以使用以下命令:
命令 使用情况 !dumpheap -stat
此命令显示托管堆上的所有对象及其统计信息。 可以使用不同开关 !dumpheap
来自定义输出,以便专注于特定类型的对象、大小或状态,以便更轻松地分析托管堆并识别内存泄漏等问题。!eeheap -gc
此命令可用于获取托管堆大小。 !threads
此命令有助于检查显示所有托管线程的任何终结器线程。 !finalizequeue
此命令用于显示终结队列中的所有对象。 运行
!dumpheap -stat
后,可以看到system.char[]
system.Text.Stringbuilder
,并使用BuggyBits.Models.Link
堆上的大多数对象,计数为 322,547、322,408 和 320,031。备注
BuggyBits
是此示例中使用的示例应用程序名称。 可能会看到应用程序名称或其他进程名称(可能占用高对象)。7ff93da4a520 601 1,00,968 Microsoft.AspNetCore.Mvc.TagHelpers.ScriptTagHelper 7ff93dbbe068 2,576 1,03,040 Microsoft.AspNetCore.Mvc.ViewFeatures.TemplateInfo 7ff93dcb56f8 1,202 1,05,776 Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput 7ff93dbff3f0 1,245 1,09,560 Microsoft.AspNetCore.Mvc.ViewFeatures.HtmlHelper<System.Object> 7ff93db563b8 1,258 1,10,640 System.Collections.Generic.KeyValuePair<System.Func<System.Object, System.Threading.Tasks.Task>, System.Object>[] 7ff93dd01268 4,720 1,13,280 Microsoft.AspNetCore.Html.HtmlContentBuilder 7ff93dd01b40 4,721 1,13,304 Microsoft.AspNetCore.Mvc.ViewFeatures.AttributeDictionary 7ff93da51af0 1,202 1,15,392 Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperExecutionContext 7ff93d230af0 5,013 1,20,312 System.Object <<< omitting few to save space>>> 7ff93dbc4c38 644 1,85,472 AspNetCore.Views_Links_Index 7ff93dbc7b50 644 1,85,472 AspNetCore.Views__ViewStart 7ff93d55f218 4,722 1,88,880 Microsoft.AspNetCore.Routing.RouteValuesAddress 7ff93dbc6fa0 601 2,16,360 AspNetCore.Views_Shared__Layout 7ff93dd01738 4,720 2,26,560 Microsoft.AspNetCore.Mvc.Rendering.TagBuilder 7ff93d236618 990 2,28,360 System.Object[] 7ff93dade018 644 2,47,296 System.IO.Pipelines.Pipe 7ff93dad9da0 644 2,57,600 Microsoft.AspNetCore.HttpSys.Internal.RequestHeaders 7ff93dcf4de8 4,720 2,64,320 System.Linq.Enumerable+<OfTypeIterator>d__61<Microsoft.AspNetCore.Routing.RouteEndpoint> 7ff93dc9be58 3,711 2,68,368 Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers.ViewBufferValue[][] 7ff93dce0188 4,723 3,02,272 Microsoft.AspNetCore.Mvc.Routing.UrlActionContext 7ff93dc9b4e0 9,540 3,05,280 Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers.ViewBufferPage 7ff93dcb71d0 7,690 3,07,600 Microsoft.Extensions.Internal.CopyOnWriteDictionary<System.Object, System.Object> 7ff93dcbe430 4,752 3,33,440 Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers.ViewBufferPage[] 7ff93dcb7fd8 8,880 3,55,200 Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute 7ff93dcb5110 5,925 3,79,200 System.Func<System.Threading.Tasks.Task> 7ff93db27c10 8,853 3,96,592 Microsoft.AspNetCore.Routing.RouteEndpoint[] 7ff93dad6a98 644 3,96,704 Microsoft.AspNetCore.Server.IIS.Core.IISHttpContextOfT<Microsoft.AspNetCore.Hosting.HostingApplication+Context> 7ff93dce6a08 4,722 4,15,472 Microsoft.AspNetCore.Routing.Tree.OutboundMatchResult[] 7ff93d4285d8 4,724 4,15,536 System.Collections.Generic.KeyValuePair<System.String, System.String>[] 7ff93dcbdea0 10,694 4,27,760 Microsoft.AspNetCore.Razor.TagHelpers.DefaultTagHelperContent 7ff93da559b0 10,097 5,65,432 Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers.ViewBuffer 7ff93da46430 4,738 5,68,560 Microsoft.AspNetCore.Mvc.TagHelpers.AnchorTagHelper 7ff93dbf5ea8 10,063 8,05,040 Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers.ViewBufferTextWriter 7ff93d94ba98 21,439 8,57,560 Microsoft.AspNetCore.Routing.RouteValueDictionary 7ff93daabd18 20,881 15,99,832 System.Collections.Generic.KeyValuePair<System.String, System.Object>[] 7ff93d2f2360 853 16,53,045 System.Byte[] 7ff93d2f1e18 23,943 17,47,166 System.String 7ff93da40928 3,20,031 1,02,40,992 BuggyBits.Models.Link 7ff93d4b7dc0 3,22,408 1,54,75,584 System.Text.StringBuilder 017e072f9d90 4,25,254 52,07,33,840 Free 7ff93d333058 3,22,547 6,40,93,53,398 System.Char[] Total 17,82,793 objects, 6,98,09,63,784 bytes
转储各种大小的
char[]
统计信息,以确定是否存在模式(这是一个试用和错误过程,因此必须尝试不同的大小来确定字符串的主体位置)。运行以下命令
!dumpheap -mt 7ff93d333058
,列出托管堆上具有指定方法表 (MT) 地址7ff93d333058
System.Char[]
的所有对象。Address MT Size 017e076607a0 7ff93d333058 20,024 017e07665640 7ff93d333058 20,024 017e0766a4e0 7ff93d333058 20,024 017e0766f380 7ff93d333058 20,024 017e07674220 7ff93d333058 20,024 017e076790c0 7ff93d333058 20,024 017e0767df60 7ff93d333058 20,024 017e07682e00 7ff93d333058 20,024 017e07687ca0 7ff93d333058 20,024 017e0768cb40 7ff93d333058 20,024 017e076919e0 7ff93d333058 20,024 017e07696880 7ff93d333058 20,024 017e0769b720 7ff93d333058 20,024 017e076a05c0 7ff93d333058 20,024 017e076a5460 7ff93d333058 20,024 017e076aa300 7ff93d333058 20,024 017e076af1a0 7ff93d333058 20,024 017e076b4040 7ff93d333058 20,024 017e076b8ee0 7ff93d333058 20,024 017e076bdd80 7ff93d333058 20,024 017e076c2c20 7ff93d333058 20,024 017e076c7ac0 7ff93d333058 20,024 017e076cc960 7ff93d333058 20,024 017e076d1800 7ff93d333058 20,024 017e076d66a0 7ff93d333058 20,024 017e076db540 7ff93d333058 20,024 017e076e03e0 7ff93d333058 20,024 017e076e5280 7ff93d333058 20,024 017e076ea120 7ff93d333058 20,024 017e076eefc0 7ff93d333058 20,024 017e076f3e60 7ff93d333058 20,024 017e076f8d00 7ff93d333058 20,024 017e076fdba0 7ff93d333058 20,024 017e07702a40 7ff93d333058 20,024 017e077078e0 7ff93d333058 20,024 017e0770c780 7ff93d333058 20,024 017e07711620 7ff93d333058 20,024 017e077164c0 7ff93d333058 20,024
可以看到其中大多数大小相同。 可以看到以下统计信息:
Statistics: MT Count TotalSize Class Name 7ff93d333058 55,862 1,11,21,80,222 System.Char[] Total 55,862 objects, 1,11,21,80,222 bytes
转储其中一些内容,找出它们包含的内容。
0:000> !do 017e9a469e08 Name: System.Char[] MethodTable: 00007ff93d333058 EEClass: 00007ff93d332fd8 Size: 20024(0x4e38) bytes Array: Rank 1, Number of elements 10000, Type Char (Print Array) Content: http://blogs.msdn.com/tom....................................................................................................... Fields: None 0:000> !do 017e9a464f10 Name: System.Char[] MethodTable: 00007ff93d333058 EEClass: 00007ff93d332fd8 Size: 20024(0x4e38) bytes Array: Rank 1, Number of elements 10000, Type Char (Print Array) Content: http://blogs.msdn.com/jamesche.................................................................................................. Fields:
现在,你需要知道为什么不收集它们。
如果在其中一些地址上运行
gcroot
,则会看到终结器队列:0:000> !gcroot 017e9a469e08 Finalizer Queue: 000001831657ced0 (finalizer root) -> 017e9a469da0 BuggyBits.Models.Link -> 017e9a469dc0 System.Text.StringBuilder -> 017e9a469e08 System.Char[]
检查终结器线程以查看其正在执行的操作。
运行
!threads
以列出所有线程并显示其状态。 你会看到线程 42 具有终结器:0:000> !threads ThreadCount: 86 UnstartedThread: 0 BackgroundThread: 36 PendingThread: 0 DeadThread: 49 Hosted Runtime: no Lock DBG ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception 24 1 7f04 0000017E06A683A0 202a020 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 MTA 42 2 c588 0000017E06A435C0 202b220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 MTA (Finalizer) 44 3 ca94 0000017E06A45BA0 102a220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 MTA (Threadpool Worker) XXXX 4 0 0000017E06A448B0 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) 45 6 7424 0000017E06A45550 8029220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 MTA (Threadpool Completion Port) 46 7 ad48 0000017E06A44F00 202b220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 MTA 19 11 c1a0 0000018315B92F90 20220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn XXXX 13 0 0000018315B922F0 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 15 0 0000018315B96EB0 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 16 0 0000018315B92940 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 17 0 0000018315B93C30 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) 15 18 b878 0000018315B94280 20220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn 17 19 9960 0000018315B91000 20220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn 18 20 90cc 0000018315B90360 20220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn XXXX 14 0 0000018315B935E0 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 12 0 0000018315B948D0 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 5 0 0000018315B95570 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 21 0 0000018315B8FD10 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 22 0 0000018315B91650 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 23 0 0000018315B96210 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 24 0 0000018315B909B0 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) 16 27 6bc 0000018315B95BC0 20220 Preemptive 00000180E160EEF0:00000180E160F250 0000017e06237220 0 Ukn 14 28 c284 0000018315B96860 20220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn XXXX 29 0 0000017E06A461F0 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 30 0 0000018315BC7E90 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 31 0 0000018315BC7840 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 32 0 0000018315BC6BA0 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 34 0 0000018315BC6550 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 38 0 0000018315BC58B0 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 39 0 0000018315BC84E0 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 40 0 0000018315BC1990 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) 7 41 c4cc 0000018315BC5F00 20220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn XXXX 42 0 0000018315BC1FE0 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 43 0 0000018315BC2630 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 44 0 0000018315BC2C80 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) 9 48 b838 0000018315BC45C0 20220 Preemptive 0000017EE1D45B38:0000017EE1D45FD0 0000017e06237220 0 Ukn 5 49 a40 0000018315BC4C10 20220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn XXXX 50 0 0000018315D0AA30 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 51 0 0000018315D06B10 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) XXXX 52 0 0000018315D0C370 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) 8 53 7024 0000018315D05820 20220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn XXXX 54 0 0000018315D077B0 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) 11 55 7068 0000018315D05E70 20220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn 10 56 c0ac 0000018315D090F0 20220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn XXXX 63 0 00000183158CA200 1039820 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn (Threadpool Worker) 4 64 83d0 00000183158CAEA0 20220 Preemptive 0000018121307DF8:0000018121307FD0 0000017e06237220 0 Ukn 6 65 beb4 0000018315894860 20220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn 48 66 cad4 0000018315D0B6D0 21220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn 49 67 94f8 0000018315D0A3E0 21220 Preemptive 0000000000000000:0000000000000000 0000017e06237220 0 Ukn
转储线程 42 并检查堆栈,然后会看到
buggybits.models.link
调用某些 Thread.Sleep:0:042> k *** WARNING: Unable to verify checksum for BuggyBits.dll # Child-SP RetAddr Call Site 00 00000027`987ff4e8 00007ffa`98245683 ntdll!NtDelayExecution+0x14 01 00000027`987ff4f0 00007ffa`9593993d ntdll!RtlDelayExecution+0x43 02 00000027`987ff520 00007ff9`9cce7404 KERNELBASE!SleepEx+0x7d 03 (Inline Function) --------`-------- coreclr!EESleepEx+0xd 04 00000027`987ff5a0 00007ff9`9cce72ed coreclr!Thread::UserSleep+0xbc 05 00000027`987ff600 00007ff9`9c7ec46b coreclr!ThreadNative::Sleep+0xad 06 00000027`987ff750 00007ff9`3ddd6eac System_Private_CoreLib!System.Threading.Thread.Sleep+0xb 07 00000027`987ff780 00007ff9`9cd86c16 BuggyBits!BuggyBits.Models.Link.Finalize+0x1c 08 00000027`987ff7c0 00007ff9`9cd28bf7 coreclr!FastCallFinalizeWorker+0x6 09 00000027`987ff7f0 00007ff9`9cd28ad2 coreclr!MethodTable::CallFinalizer+0x97 0a (Inline Function) --------`-------- coreclr!CallFinalizer+0x3d 0b (Inline Function) --------`-------- coreclr!FinalizerThread::DoOneFinalization+0x3d 0c 00000027`987ff830 00007ff9`9cd284f7 coreclr!FinalizerThread::FinalizeAllObjects+0xda 0d 00000027`987ff920 00007ff9`9cd293c2 coreclr!FinalizerThread::FinalizerThreadWorker+0x97 0e (Inline Function) --------`-------- coreclr!ManagedThreadBase_DispatchInner+0xd 0f 00000027`987ff960 00007ff9`9cd292af coreclr!ManagedThreadBase_DispatchMiddle+0x7e 10 00000027`987ffa80 00007ff9`9cc85f3a coreclr!ManagedThreadBase_DispatchOuter+0xaf 11 (Inline Function) --------`-------- coreclr!ManagedThreadBase_NoADTransition+0x28 12 (Inline Function) --------`-------- coreclr!ManagedThreadBase::FinalizerBase+0x28 13 00000027`987ffb20 00007ff9`9cd734ca coreclr!FinalizerThread::FinalizerThreadStart+0x7a 14 00000027`987ffc40 00007ffa`9725257d coreclr!Thread::intermediateThreadProc+0x8a 15 00000027`987ffd00 00007ffa`9824af28 kernel32!BaseThreadInitThunk+0x1d 16 00000027`987ffd30 00000000`00000000 ntdll!RtlUserThreadStart+0x28
检查Link.cs文件中的以下代码片段,你将看到有显式调用
Thread.Sleep
,这会导致内存使用率过高。备注
如本文前面所述,
BuggyBits
以下代码片段特定于用于创建此示例的示例应用程序。如果遇到类似的情况,请检查应用程序代码,并在应用程序中发现了一种基于转储分析导致内存过高问题的特定方法。// BuggyBits.Models.Link // Flags = reuse slot, hide by signature protected override void Finalize() { try { System.Threading.Thread.Sleep(5000); } finally { base.Finalize(); } return; }