次の方法で共有


メモリ消費量が多い問題の概要

このトラブルシューティング ガイドでは、メモリ リークに関連するシナリオに焦点を当てて、アプリケーションでのメモリ消費量の高い問題を診断して解決する手順を示します。 これは、一般的な症状、さまざまなシステム構成でのメモリ使用量に関連する制限、問題を効果的に診断するために必要なツールを理解するのに役立ちます。

データ キャプチャ ツール

Note

  • タスク マネージャーを使用してメモリ ダンプを収集しないでください。 DebugDiag や Procdump などの特殊なツールは、マネージド コードをよりよく理解し、プロセスのビット数を自動的に処理するため、ASP.NET アプリケーションに対してより効果的です。
  • 便利なメモリ ダンプのセットを取得するには、複数回の試行が必要になる場合があります。
  • メモリ ダンプ用の十分なディスク領域があることを確認します。 各ダンプは、その時点のプロセスのおおよそのサイズです。 たとえば、プロセスが 1 ギガバイト (GB) の場合、3 つのダンプを生成するには約 4 GB の領域が必要です。

さまざまなシナリオでのメモリ制限

通常、メモリ リークによりメモリ使用量が着実に増加し、クラッシュやパフォーマンスの低下が発生します。

Note

メモリ使用量が多い場合は、必ずしもリークを示すわけではありません。割り当てられたメモリが後で解放されると、プロセスが復旧する可能性があります。 メモリ リークは、割り当てが解放されないアプリケーションの 1 つ以上のバグによって発生します。

  • 32 ビット アプリケーション: 32 ビット アプリケーションがクラッシュし、メモリ不足時に OutOfMemory 例外がスローされることがあります。クラッシュ前にエラーが報告されていない可能性があります。 メモリ割り当てエラーがアプリケーション コードで適切に処理されない場合、予期しない動作をする可能性があります。
  • 64 ビット アプリケーション: アドレス空間が大きいために仮想メモリを割り当てようとしたときに、64 ビット アプリケーションが失敗することはほとんどありません。 ただし、仮想アドレス空間が非常に大きくなり、物理メモリの過剰なページングが発生し、物理メモリを競合するアプリケーションや他のアプリケーションに影響を与える可能性があります。
シナリオ メモリ制限 詳細
32 ビット Windows 上の 32 ビット アプリケーション 合計 4 GB ( ユーザー モードでは 2 GBカーネル モードでは 2 GB) 32 ビット アプリケーションで /LARGEADDRESSAWARE フラグを使用し、起動時にオペレーティング システムのboot.ini ファイルで /3 GB スイッチを使用すると、ユーザー モード メモリが 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 エクサバイト (EB) (最大 100 Crore GB)。 ただし、Windows 10 x 64 では 48 ビットの仮想アドレスがサポートされています。2^48 バイト = 256 TB ( ユーザー モードでは 128 TBカーネル モードでは 128 TB)。 NA
32 ビット Windows 上の 64 ビット アプリケーション 無効なシナリオ NA

高いメモリ使用量を特定する

メモリ使用量が多い場合を識別する最も簡単な方法は、インターネット インフォメーション サービス (IIS) マネージャーの Worker Processes モジュールを使用して、Private Bytes (KB) カウンターを監視することです。 Private Bytes (KB) カウンターは、プロセスによって使用されるプライベートコミットメモリの量を示します。

Private Bytes (KB)を監視するには、次の手順に従います。

  1. IIS マネージャーを開きます。

  2. サーバー名 (左側) を選択します。

  3. Worker プロセスをダブルクリックします。

  4. Private Bytes (KB)を確認します。 スクリーンショットを次に示します。

    [プライベート バイト (KB)] 列が強調表示されているワーカー プロセスのスクリーンショット。

    w3wp.exe プロセス (IIS ワーカー プロセス) の Private Bytes (KB) 値が、さまざまなシナリオのメモリ制限で説明されているようにメモリ制限に達した場合w3wp.exe プロセスのメモリの問題が高くなります。 Process Idアプリケーション プール名が横に表示されます。 このビューを手動で更新することが必要な場合があります。

メモリ リークがマネージドかネイティブかを特定する

w3wp.exe プロセスでメモリ使用量が多く発生していることを確認したら、次の手順は、それがマネージド メモリ リークかネイティブ メモリ リークかを特定することです。 メモリ リークの種類を特定するには、次の手順に従います。

  1. パフォーマンス モニターを開き、+ アイコンを選択してカウンターを追加します。

    パフォーマンス モニターのプラス アイコンが強調表示されているスクリーンショット。

  2. .NET CLR Memory カウンターですべてのヒープの # バイト数を選択し、ターゲット プロセス (ここでは w3wp) を選択し、Add を選択します。

  3. Process カウンターの下の Private BytesVirtual Bytes を選択し、ターゲット プロセスを選択してから Add を選択します (ワーキング セットは無視できます)。

    [カウンターの追加] ウィンドウのスクリーンショット。

  4. [OK] を選択します。

  5. 問題を再現します。

  6. マネージド メモリ リークかネイティブ メモリ リークかを確認するには、カウンターを監視します。

    • マネージド メモリ リーク: Private Bytes カウンターと Virtual Bytes カウンターが同じレートで増加した場合 (それらの差は一定のまま)、マネージド メモリ リークを示します。

      マネージド メモリ リークのカウンターがどのように変化するかを示すスクリーンショット。

    • ネイティブ メモリ リーク: Private Bytes カウンターが増加しても、すべてのヒープ内の # バイト数 カウンターが一定のままである場合は、ネイティブ メモリ リークを示します。

      ネイティブ メモリ リークのカウンターがどのように変化するかを示すスクリーンショット。

データ収集

メモリ リークの種類を確認したら、次の手順では、メモリ使用量が多いイベント中に、ツールを使用してプロセスのメモリ ダンプを収集します。 これらのダンプは、問題の原因を分析して診断するのに役立ちます。

.NET Core アプリケーション

対象のアプリケーションが .NET Core であり、インプロセス モードで IIS でホストされている場合は、 Data キャプチャのデータ収集手順を使用して、マネージド メモリ リーク。 ただし、アプリケーションがプロセス外モードで IIS でホストされている場合は、w3wp.exeの代わりに dotnet プロセスを調査するようにアクションを変更します (特に指定がない場合はdotnet.exe)。 セルフホステッド .NET Core アプリケーションにも同じことが当てはまります。

トラブルシューティングの例

IIS サーバーでホストされているアプリケーションがあり、特定の URL にアクセスするときにメモリ使用率が高い (ストレス テストを実行することでメモリが最大 7 GB に急増する) と仮定し、次の手順に従って問題を診断します。

  1. メモリ リークがマネージドかネイティブかをIdentify の手順に従って、パフォーマンス モニターを確認しますPrivate BytesVirtual Bytes の違いが一定のままである場合は、マネージド メモリ リークになります。

  2. DebugDiag の使用」で説明されている手順に従って、ダンプ ファイルを収集

  3. WinDbg でダンプ ファイルを開きます。 メモリが多いシナリオでは、次のコマンドを使用できます。

    command 使用方法
    !dumpheap -stat このコマンドは、マネージド ヒープ上のすべてのオブジェクトとその統計情報を表示します。 !dumpheapのさまざまなスイッチを使用して出力をカスタマイズして、特定の種類のオブジェクト、サイズ、または状態に焦点を当てることができます。これにより、マネージド ヒープの分析やメモリ リークなどの問題の特定が容易になります。
    !eeheap -gc このコマンドを使用して、マネージド ヒープ サイズを取得できます。
    !threads このコマンドは、すべてのマネージド スレッドを表示するファイナライザー スレッドを確認するのに役立ちます。
    !finalizequeue このコマンドは、最終処理キュー内のすべてのオブジェクトを表示するために使用されます。
  4. !dumpheap -statを実行すると、system.char[]system.Text.Stringbuilder、およびBuggyBits.Models.Linkがヒープ上のほとんどのオブジェクトを消費し、カウントは 322,547、322,408、320,031 であることがわかります。

    Note

    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 をダンプしてスタックを確認すると、Thread.Sleep を呼び出buggybits.models.link

    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が明示的に呼び出され、メモリ使用率が高いことがわかります。

    Note

    この記事で前述したように、 BuggyBits と次のコード スニペットは、この例の作成に使用されるサンプル アプリケーションに固有です。同様のシナリオに遭遇し、ダンプ分析に基づいてメモリの高い問題を引き起こしている特定のメソッドがアプリケーションで見つかった場合は、アプリケーション コードを確認します。

    // BuggyBits.Models.Link 
    // Flags = reuse slot, hide by signature 
    protected override void Finalize() 
    { 
      try 
      { 
        System.Threading.Thread.Sleep(5000); 
      } 
      finally 
      { 
        base.Finalize(); 
      } 
      return; 
    } 
    

詳細