このトラブルシューティング ガイドでは、メモリ リークに関連するシナリオに焦点を当てて、アプリケーションでのメモリ消費量の高い問題を診断して解決する手順を示します。 これは、一般的な症状、さまざまなシステム構成でのメモリ使用量に関連する制限、問題を効果的に診断するために必要なツールを理解するのに役立ちます。
データ キャプチャ ツール
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)を監視するには、次の手順に従います。
IIS マネージャーを開きます。
サーバー名 (左側) を選択します。
Worker プロセスをダブルクリックします。
Private Bytes (KB)を確認します。 スクリーンショットを次に示します。
w3wp.exe プロセス (IIS ワーカー プロセス) の Private Bytes (KB) 値が、さまざまなシナリオのメモリ制限で説明されているようにメモリ制限に達した場合w3wp.exe プロセスのメモリの問題が高くなります。 Process Idとアプリケーション プール名が横に表示されます。 このビューを手動で更新することが必要な場合があります。
メモリ リークがマネージドかネイティブかを特定する
w3wp.exe プロセスでメモリ使用量が多く発生していることを確認したら、次の手順は、それがマネージド メモリ リークかネイティブ メモリ リークかを特定することです。 メモリ リークの種類を特定するには、次の手順に従います。
パフォーマンス モニターを開き、+ アイコンを選択してカウンターを追加します。
.NET CLR Memory カウンターですべてのヒープの # バイト数を選択し、ターゲット プロセス (ここでは w3wp) を選択し、Add を選択します。
Process カウンターの下の Private Bytes と Virtual Bytes を選択し、ターゲット プロセスを選択してから Add を選択します (ワーキング セットは無視できます)。
[OK] を選択します。
問題を再現します。
マネージド メモリ リークかネイティブ メモリ リークかを確認するには、カウンターを監視します。
マネージド メモリ リーク: Private Bytes カウンターと Virtual Bytes カウンターが同じレートで増加した場合 (それらの差は一定のまま)、マネージド メモリ リークを示します。
ネイティブ メモリ リーク: Private Bytes カウンターが増加しても、すべてのヒープ内の # バイト数 カウンターが一定のままである場合は、ネイティブ メモリ リークを示します。
データ収集
メモリ リークの種類を確認したら、次の手順では、メモリ使用量が多いイベント中に、ツールを使用してプロセスのメモリ ダンプを収集します。 これらのダンプは、問題の原因を分析して診断するのに役立ちます。
- マネージド メモリ リークのダンプを収集するには、マネージド メモリ リークの Data キャプチャに関するページを参照してください。
- ネイティブ メモリ リークのダンプを収集するには、「 IIS 7.x アプリケーション プールでネイティブ メモリ リークをトラブルシューティングするを参照してください。
.NET Core アプリケーション
対象のアプリケーションが .NET Core であり、インプロセス モードで IIS でホストされている場合は、 Data キャプチャのデータ収集手順を使用して、マネージド メモリ リーク。 ただし、アプリケーションがプロセス外モードで IIS でホストされている場合は、w3wp.exeの代わりに dotnet プロセスを調査するようにアクションを変更します (特に指定がない場合はdotnet.exe)。 セルフホステッド .NET Core アプリケーションにも同じことが当てはまります。
トラブルシューティングの例
IIS サーバーでホストされているアプリケーションがあり、特定の URL にアクセスするときにメモリ使用率が高い (ストレス テストを実行することでメモリが最大 7 GB に急増する) と仮定し、次の手順に従って問題を診断します。
メモリ リークがマネージドかネイティブかをIdentify の手順に従って、パフォーマンス モニターを確認します。 Private Bytes と Virtual Bytes の違いが一定のままである場合は、マネージド メモリ リークになります。
WinDbg でダンプ ファイルを開きます。 メモリが多いシナリオでは、次のコマンドを使用できます。
command 使用方法 !dumpheap -stat
このコマンドは、マネージド ヒープ上のすべてのオブジェクトとその統計情報を表示します。 !dumpheap
のさまざまなスイッチを使用して出力をカスタマイズして、特定の種類のオブジェクト、サイズ、または状態に焦点を当てることができます。これにより、マネージド ヒープの分析やメモリ リークなどの問題の特定が容易になります。!eeheap -gc
このコマンドを使用して、マネージド ヒープ サイズを取得できます。 !threads
このコマンドは、すべてのマネージド スレッドを表示するファイナライザー スレッドを確認するのに役立ちます。 !finalizequeue
このコマンドは、最終処理キュー内のすべてのオブジェクトを表示するために使用されます。 !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
さまざまなサイズの
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 をダンプしてスタックを確認すると、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
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; }