内存消耗问题概述

本故障排除指南提供了诊断和解决应用程序中内存消耗过高问题的步骤,重点介绍涉及内存泄漏的方案。 它可帮助你了解典型症状、不同系统配置中与内存使用量相关的限制,以及有效诊断问题所需的工具。

数据捕获工具

备注

  • 避免使用任务管理器收集内存转储。 调试调试和 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),请执行以下步骤:

  1. 打开“IIS 管理器”。

  2. 选择服务器名称(左侧)。

  3. 双击“ 工作进程”。

  4. 检查专用字节数(KB)。 下面是屏幕截图:

    突出显示了专用字节(KB)列的工作进程的屏幕截图。

    如果w3wp.exe进程(IIS 工作进程)的专用字节(KB)值达到内存限制,如不同方案的内存限制中所述w3wp.exe进程存在较高的内存问题。 进程 ID应用程序池名称显示在它旁边。 可能需要手动刷新此视图。

确定内存泄漏是托管还是本机

确认w3wp.exe进程内存使用率较高后,下一步是确定它是托管内存还是本机内存泄漏。 按照以下步骤确定内存泄漏的类型:

  1. 打开性能监视器并选择+要添加计数器的图标。

    突出显示性能监视器中的加号图标的屏幕截图。

  2. 选择 .NET CLR 内存计数器下所有堆中的 #字节数,选择目标进程(此处为 w3wp),然后选择“添加”。

  3. 选择进程计数器下的专用字节虚拟字节,选择目标进程,然后选择“添加(可以忽略工作集)。

    “添加计数器”窗口的屏幕截图。

  4. 选择“确定”

  5. 重现此问题。

  6. 若要验证它是托管内存还是本机内存泄漏,请监视计数器:

    • 托管内存泄漏:如果专用字节计数器和虚拟字节计数器以相同的速率增加(它们之间的差异保持不变),则表示托管内存泄漏。

      显示计数器如何更改托管内存泄漏的屏幕截图。

    • 本机内存泄漏:如果 专用字节 计数器增加,但 所有堆 计数器中的 #字节数保持不变,则表示本机内存泄漏。

      显示计数器如何更改本机内存泄漏的屏幕截图。

数据收集

确认内存泄漏类型后,下一步是使用工具在高内存使用率事件期间收集进程的内存转储。 这些转储可以帮助你分析和诊断问题的原因。

.NET Core 应用程序

如果相关应用程序为 .NET Core 并在进程内模式下托管在 IIS 上,请使用数据捕获中的 数据收集步骤进行托管内存泄漏。 但是,如果应用程序托管在进程外模式下的 IIS 上,请修改操作以调查 dotnet 进程 dotnet.exe除非另有指定),而不是w3wp.exe。 这同样适用于自承载 .NET Core 应用程序。

故障排除示例

假设你在 IIS 服务器上托管了一个应用程序,并在访问特定 URL 时遇到高内存使用率(通过执行压力测试,内存峰值高达 7 GB),请按照以下步骤诊断问题:

  1. 按照“确定内存泄漏是托管还是本机”中的步骤检查性能监视器。 如果注意到专用字节和虚拟字节之间的差异保持不变,则这是托管内存泄漏。

  2. 按照使用 DebugDiag 中所述的步骤收集转储文件。

  3. 在 WinDbg打开转储文件。 对于高内存方案,可以使用以下命令:

    命令 使用情况
    !dumpheap -stat 此命令显示托管堆上的所有对象及其统计信息。 可以使用不同开关 !dumpheap 来自定义输出,以便专注于特定类型的对象、大小或状态,以便更轻松地分析托管堆并识别内存泄漏等问题。
    !eeheap -gc 此命令可用于获取托管堆大小。
    !threads 此命令有助于检查显示所有托管线程的任何终结器线程。
    !finalizequeue 此命令用于显示终结队列中的所有对象。
  4. 运行!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
    
  5. 转储各种大小的 char[] 统计信息,以确定是否存在模式(这是一个试用和错误过程,因此必须尝试不同的大小来确定字符串的主体位置)。

  6. 运行以下命令!dumpheap -mt 7ff93d333058,列出托管堆上具有指定方法表 (MT) 地址7ff93d333058System.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 
    
  7. 转储其中一些内容,找出它们包含的内容。

    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: 
    
  8. 现在,你需要知道为什么不收集它们。

    如果在其中一些地址上运行 gcroot ,则会看到终结器队列:

    0:000> !gcroot 017e9a469e08 
    Finalizer Queue: 
    000001831657ced0 (finalizer root) 
           -> 017e9a469da0     BuggyBits.Models.Link  
           -> 017e9a469dc0     System.Text.StringBuilder  
           -> 017e9a469e08     System.Char[]
    
  9. 检查终结器线程以查看其正在执行的操作。

    运行 !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  
    
  10. 转储线程 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
    
  11. 检查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; 
    } 
    

详细信息