ネットのメモリ管理に関する5つの基本
1. スモールオブジェクトはどのように扱われるのか?
小さい
NET
オブジェクトは、スモールオブジェクトヒープ (
SOH
)をヒープ上に置く。第0世代、第1世代、第2世代の3つがあります。オブジェクトはその寿命に応じて上に移動する。
新しいオブジェクトをGen 0に配置します。 Gen 0が一杯になると、.NETガベージコレクタ(GC)が実行され、不要になったオブジェクトを廃棄し、それ以外のものをすべて
Gen1
. Gen 1 が一杯になると、GC は再び実行され、Gen 1 から Gen 2 へオブジェクトを移動させることもできます。
いつ
Gen 2
が満杯になると
GC
がフル稼働します。これにより、不要な
Gen 2
オブジェクトを作成し
Gen 1
オブジェクトを
Gen 2
を移動させ、さらに
Gen 0
オブジェクトを Gen 1 に移動し、最後に参照されないコンテンツをクリアします。を実行するたびに
GC
の後に、まだ使用されているメモリをまとめておくために、影響を受けるヒープを圧縮します。
この世代別アプローチにより、時間のかかる圧縮処理は絶対に必要な場合のみ行われるため、効率的な運用が可能になります。
注意事項
を使用している場合は
Gen 2
が表示された場合、メモリが長時間確保されていることを意味し、メモリに問題がある可能性があります。そこで便利なのが、メモリ解析ツールです。
2. 大きなオブジェクトはどうなるのか?
よりも大きいです。
85 KB
オブジェクトはラージオブジェクトヒープに割り当てられます (
LOH
). 大きなメモリチャンクをコピーするオーバーヘッドがあるため、圧縮されない。完全な
GC
が発生すると、未使用の
LOH
オブジェクトのアドレス範囲は、使用可能な領域割り当てテーブルに記録されます。
新しいオブジェクトを割り当てた後、そのオブジェクトを保持するのに十分なアドレス範囲が、この利用可能領域テーブルでチェックされます。存在すればそこに割り当てられ、存在しなければ次の空きスペースに割り当てられる。
オブジェクトが空のアドレス範囲と同じサイズになることはまずないので、ほとんどの場合、オブジェクトの間に小さなメモリのチャンクが残り、フラグメンテーションが発生します。もしこれらのチャンクが
85 KB
となると、再利用の可能性はまったくない。したがって、割り当ての必要性が高まると、断片化された領域がまだ利用可能であっても、新しいセグメントが確保されます。
さらに、大きなオブジェクトを割り当てる必要がある場合、.NETは依然として、高価な
Gen 2 GC
. これはパフォーマンス的には良いのですが、メモリの断片化を引き起こす大きな原因となっています。
3. ガベージコレクタは、パフォーマンスを最適化するために異なるモードで実行することができます
.NETは、パフォーマンスを最適化するためにさまざまなモードで実行することができます /h2
.NETでは、パフォーマンスを最適化するために、ガベージコレクタを
GC
.NETは、パフォーマンスとヒープ効率のトレードオフに対処するため
Workstation mode provides maximum responsiveness for users and reduces pauses due to GC. It can be run as "concurrent" or "non-concurrent", meaning that running
GC
threads. The default value is concurrent, which uses a separate thread for GC, so the application can run the
GC
continues to execute while the
Server mode provides maximum throughput, scalability, and performance for server environments. In server mode, segment sizes and generation thresholds are typically much larger than in workstation mode, reflecting the higher demands placed on the server.
Server mode runs garbage collection in parallel on multiple threads, allocating a separate SOH and LOH for each logical processor to prevent threads from interfering with each other.
NET
framework provides a cross-referencing mechanism, so objects can still refer to each other across the heap. However, since application responsiveness is not a direct target of the server model, all application threads will be hung during GC.
4. Under-referencing can be a tradeoff between performance and memory efficiency
Weak objects referenced by
GC
alternative source of roots, allowing you to keep objects while allowing you to collect them when GC requires them. They are a compromise between code performance and memory efficiency. Creating objects takes up
CPU
time, but memory is required to maintain the loaded state.
Weak references are especially useful for large data structures. For example, suppose you have an application that allows users to browse large data structures, and they may return some of that data. You can convert any strong reference to a weak reference to the structure they are browsing. If the user returns to these structures, they can use them, but if not, the GC can reclaim memory as needed.
5. Object fixes can create references that are passed between managed and unmanaged code
NET
Use a method called
GCHandle
structure to keep track of heap objects.
The GCHandle
can be used to pass object references between managed and unmanaged domains, .NET maintains a
GCHandles
table for this purpose.
The GCHandle
There are four types, including fixed, for fixing objects to specific addresses in memory.
The main problem with object fixation is that it can lead to
SOH
fragmentation. If the object is fixed in
GC
period, then by definition the object cannot be relocated. Depending on how you use the fix, it will reduce the efficiency of the compression and leave gaps in the heap. The best strategy to avoid this is to lock and then release in a very short period of time.
This article on the five fundamentals of Net memory management is all about this. For more information on the five fundamentals of Net memory management, please search the previous articles in the Codedevlib or continue to browse the related articles below.
関連
-
NET 6の新しい設定オブジェクトConfigurationManagerの紹介
-
.netcoreプロジェクトでIStartupFilterを使用するためのチュートリアル
-
.NET Coreでオブジェクトプールを使用する
-
ASP.NET Core Dependency Injectionフレームワークの活用
-
ASP.NET Core ディペンデンシーインジェクションの詳細
-
swagger uiをasp.net coreに統合する原理
-
ASP.NET Core MVC フィルタ
-
再起動を伴わないNET5の設定変更は自動的に反映される
-
asp.net core3.1 cookieとjwtのハイブリッド認証による多様な認証ソリューションの実現
-
名前 'xxx' が現在のコンテキストに存在しない エラー解決方法の1つ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
.NET開発サーバー アプリケーション管理ツール
-
ASP.NET CoreでCAPの取引詳細を自動で有効にする
-
ASP.NET学習でよくあるエラーのまとめ
-
ASP.NETでWeb.configからログインする際の正しいアカウントパスワードを確認する
-
ASP.NET Core MVC Dependency Injection ビューとコントローラ
-
認証プロセスの記録にjwtを使用したネット
-
ネットパフォーマンスチューニング - ArrayPool 詳細
-
ASP.NET Coreで複数のサービス実装クラスをインジェクトする方法
-
ASP.NETのオンライン統計とアプリケーションとセッションを使用した訪問履歴
-
ASP.NETでのRadioButton(ラジオボタン)の使用について