#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/]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS