#author("2020-10-02T04:06:15+00:00","default:admin","admin") #author("2020-10-02T04:38:11+00:00","default:admin","admin") -[[ASP.NET Core のメモリ管理とガベージコレクション (GC):https://docs.microsoft.com/ja-jp/aspnet/core/performance/memory?view=aspnetcore-3.1]] -[[What is server garbage collection in ASP.NET Core?:https://www.thetopsites.net/article/54050172.shtml]] *ガベージコレクション [#je5dddfb] -[[ガベージ コレクションの実行時構成オプション:https://docs.microsoft.com/ja-jp/dotnet/core/run-time-config/garbage-collector]] **ワークステーションGC・サーバGC [#se72081c] -[[ワークステーションとサーバーのガベージ コレクション:https://docs.microsoft.com/ja-jp/dotnet/standard/garbage-collection/workstation-server-gc]] -''ガベージ コレクターは、さまざまなシナリオに対応できるように自動的に調整される'' -ただし、作業負荷の特性に基づいてガベージ コレクションの種類を設定できる ***ワークステーションGC [#l37afaa1] -コレクションは、ガベージ コレクションをトリガーしたユーザー スレッドで、それと同じ優先順位で実行される -ユーザー スレッドは一般に通常の優先順位で実行されるため、その場合 (通常の優先順位のスレッドで実行された場合)、ガベージ コレクターの CPU 時間が他のスレッドと競合する -ネイティブ コードを実行するスレッドは、サーバーまたはワークステーションのガベージ コレクションでは中断されない -''&color(red){プロセッサが 1 つしかないコンピューターでは、構成設定に関係なく、常にワークステーションのガベージ コレクションが使用される};'' ***サーバGC [#z201fc94] -コレクションは、 THREAD_PRIORITY_HIGHEST の優先順位で実行される複数の専用スレッドで実行される -ヒープおよびガベージ コレクションを実行するための専用スレッドは CPU ごとに 1 つずつ用意され、複数のヒープのコレクションが同時に行われる -各ヒープには小さなオブジェクト ヒープと大きなオブジェクト ヒープがあり、どのヒープもユーザー コードからアクセスできる -異なるヒープのオブジェクトを相互に参照できる - 複数のガベージ コレクション スレッドが連携して処理を行うため、同じサイズのヒープを処理した場合、サーバーのガベージ コレクションの方がワークステーションのガベージ コレクションよりも高速 -一般に、サーバーのガベージ コレクションの方が、格納されるセグメントのサイズは大きくなる(一般論) -サーバーのガベージ コレクションでは、リソースが大量に消費されることがある --たとえば、プロセッサが 4 つのコンピューターで実行されているサーバー GC が 12 個のプロセスで使用されているとします。 --すべてのプロセスで偶然、同時にガベージを回収すると、互いに干渉することになります。同じプロセッサで 12 のスレッドがスケジュールされるためです。 -プロセスがアクティブの場合、すべてのプロセスでサーバー GC を使用することはお勧めしません。 *メモリリーク [#sa117703] -[[.NET Core でメモリ リークをデバッグする:https://docs.microsoft.com/ja-jp/dotnet/core/diagnostics/debug-memory-leak]] -[[System.Net.HttpListener が .NET Core の時だけメモリリークっぽい現象になる件の解決策:http://www.moonmile.net/blog/archives/9417]] -[[de:code 2019 [DT03] 上級サポート エンジニアの経験お伝えします:Visual Studio 2019 でメモリー リークを追え!:https://qiita.com/tfukumori/items/d9e2708a250c1c80d53e]] *診断ツール [#c4602122] -[[.NET Core で使用できる診断ツール:https://docs.microsoft.com/ja-jp/dotnet/core/diagnostics/]] -[[Collecting and analyzing memory dumps:https://devblogs.microsoft.com/dotnet/collecting-and-analyzing-memory-dumps/]] -[[.NET Diagnostics Tools: dump vs. gcdump:https://www.stefangeiger.ch/2020/04/21/dotnet-diagnostics-tools-gcdump-vs-dump.html]] -[[Identifying Memory Leaks with dotnet-dump and dotnet-gcdump:https://developer.samsung.com/tizen/blog/en-us/2020/07/31/identifying-memory-leaks-with-dotnet-dump-and-dotnet-gcdump]] -[[EventCounters in .NET Core:https://docs.microsoft.com/en-us/dotnet/core/diagnostics/event-counters]] -[[.NET CoreのDiagnostics CLI Toolを触ってみた:https://blog.piyosi.com/entry/2019/11/07/071600]] -.NET Core 3.1 SDK 以降でないと使えない模様 **dotnet-counters [#u5d267b7] -[[dotnet-カウンター:https://docs.microsoft.com/ja-jp/dotnet/core/diagnostics/dotnet-counters]] ***インストール [#xf33d470] dotnet tool install -g dotnet-counters ***使い方 [#c3e29582] dotnet-counters collect --process-id [監視するプロセスのID] --refresh-interval [監視間隔(秒)] --format csv **dotnet-dump [#u011d3ba] -[[ダンプの収集と分析のユーティリティ (dotnet-dump):https://docs.microsoft.com/ja-jp/dotnet/core/diagnostics/dotnet-dump]] ***インストール [#j85c9ea4] dotnet tool install -g dotnet-dump ***使い方 [#tbdd9477] -管理者権限でコマンドプロンプトを起動 -作業フォルダに移動 cd [作業フォルダのパス] -データ収集(時間がかかる。Completeが出るまで気長に待つ) dotnet-dump collect -p [解析したいプロセスのID] -解析 dotnet-dump analyze [データファイル] --対話型セッションが開始される **dotnet-gcdump [#ed104d83] -[[ヒープ分析ツール (dotnet-gcdump):https://docs.microsoft.com/ja-jp/dotnet/core/diagnostics/dotnet-gcdump]] *関連製品 [#f10c2714] -[[dotMemory:https://www.jetbrains.com/ja-jp/dotmemory/]]