bucket-sort logo bucket-sort

プログラミングとインフラエンジニアリングの覚え書き

  • Posts
  • About
  • Contact
  1. Home
  2. All Posts
  3. [C#] アンマネージドリソースとは

[C#] アンマネージドリソースとは

Mar 15, 2026 C# , .NET bucket-sort

C#ではGCによってメモリ管理が自動化されていますが、それでもGCの管理外にあるリソースを意識しなければならない場面は少なくありません。これがいわゆる「アンマネージドリソース」です。

GCは非常に強力ですが、アプリケーションが扱うすべてのリソースを管理しているわけではありません。この点を理解していないと、「GCがあるのにリソースが解放されない」といった問題に直面することがあります。

アンマネージドリソースとは何か

一言でまとめると、CLR(GC)が管理していないリソース です。 これらは主にOSや外部システムに存在しており、.NETの外側にある資源と考えると理解しやすいです。

具体例

アンマネージドリソースには、例えば次のようなものがあります。

OSや外部に存在するリソース

  • ファイルハンドル(File)
  • ソケット(TCP / UDP)
  • DB接続(コネクション)
  • ウィンドウハンドル(Win32)
  • GDIオブジェクト
  • ネイティブメモリ(malloc / VirtualAlloc)

共通点

  • CLRが中身を理解していない
  • GCの管理対象外である
  • OSやネイティブ側に実体がある

マネージドリソースとの違い

マネージドリソースとアンマネージドリソースの違いは、「誰が管理しているか」にあります。

種類 管理者 例
マネージド CLR(GC) string, List, class
アンマネージド OS / ネイティブ file, socket, handle

この違いは非常に重要で、次のように整理できます。

  • マネージド:CLRが自動的にライフサイクルを管理する
  • アンマネージド:自動管理されない(CLRの対象外)

GCは何を見ているのか

GCは万能に見えますが、実際には非常にシンプルな判断基準で動いています。

GCが見ているもの

  • オブジェクトへの参照が存在するかどうか
  • 参照がなければ回収する

つまり、「メモリとして不要かどうか」だけを判断している というわけです。

具体例で理解する

例えば、次のコードを考えます。

var stream = new FileStream("test.txt", FileMode.Open);

このコードの裏側では、次のような処理が行われています。

  1. OSにファイルオープンを依頼する
  2. OSがファイルハンドルを発行する
  3. C#のオブジェクトがそのハンドルを保持する

ここで重要なのは、「C#オブジェクト」と「実体」が別であるという点です。

FileStream(マネージドオブジェクト)← C#オブジェクト
    ↓
OSのファイルハンドル(アンマネージド)← 実体

GCが見ているのは、あくまで上の「FileStreamオブジェクト」のみです。 FileStreamオブジェクトが参照されているかどうかしか見ていません。

しかし実際には、次のような状態になっています。

  • OS側ではファイルが開かれている
  • ハンドルも保持されている

GCは「ファイルが開いていること」を認識していません。 このズレが、アンマネージドリソースの理解において重要なポイントになります。

イメージで整理

マネージドメモリ

[ CLRヒープ ]
  ├─ object A
  ├─ object B

GCが追跡して自動回収します。

アンマネージドリソース

[ OS ]
  ├─ file handle
  ├─ socket
  ├─ DB connection

CLRの外側にあり、GCの管理対象外です。

■ よくある誤解

GCがあるからすべて自動で安全

これは誤解です。実際は以下の通りです。

  • GCが管理するのは「メモリ」だけ
  • OSリソースは対象外

放置してもそのうち解放される

このような考え方も危険です。実際には以下の問題があります。

  • 解放タイミングは保証されない
  • その間リソースは保持され続ける

結果として、リソースの枯渇につながる可能性があります。

まとめ

アンマネージドリソースとは

  • CLRが管理していないリソース
  • OSや外部に存在する

マネージドとの違い

  • マネージド:GCが自動管理
  • アンマネージド:GCの管理対象外

本質的なポイント

  • GCはメモリしか見ていない
  • OSリソースの状態は認識しない

意識すべきこと

  • メモリ管理とリソース管理は別物である

マネージドリソースとアンマネージドリソースの違いを正しく理解しておくことで、「GCがあるのにリソースが枯渇する」といった一見不思議に見える問題の背景が理解できるようになります。

C# .NET メモリ管理 ガベージコレクション
← Livewireのファイルアップロード一時ファイルは誰が掃除しているのか [C#] IDisposeの役割と使いどころ →

Related Posts

  • [C#] Finalizable Objects — Finalize() の役割と使いどころ May 11, 2026
  • [C#] System.GC クラスを整理する — ガベージコレクションを制御するための API May 10, 2026
  • [C#] Disposable Objects — IDisposable / Dispose() と using 構文 May 12, 2026
  • [C#] IDisposeの役割と使いどころ Mar 16, 2026

Table of Contents

  • アンマネージドリソースとは何か
  • 具体例
    • OSや外部に存在するリソース
    • 共通点
  • マネージドリソースとの違い
  • GCは何を見ているのか
    • GCが見ているもの
  • 具体例で理解する
  • イメージで整理
    • マネージドメモリ
    • アンマネージドリソース
  • ■ よくある誤解
    • GCがあるからすべて自動で安全
    • 放置してもそのうち解放される
  • まとめ

Recent Posts

  • [C#] System.Collections.Specialized.ListDictionary — 小規模辞書に特化した連結リスト実装 May 22, 2026
  • [C#] System.Collections.Specialized.HybridDictionary — 小規模では ListDictionary、大規模では Hashtable May 21, 2026
  • [C#] System.Collections.Stack — 非ジェネリックな LIFO スタックの仕組みと使いどころ May 20, 2026
  • [C#] System.Collections.SortedList — キーで自動整列される連想配列の仕組みと使いどころ May 19, 2026
  • [C#] System.Collections.Queue — 非ジェネリックな FIFO キューの仕組みと使いどころ May 18, 2026

Categories

  • C#72
  • .NET71
  • AWS27
  • Laravel16
  • Linux15
  • MySQL9
  • Apache8
  • PHP8
  • DynamoDB6
  • セキュリティ6
  • Nginx5
  • WordPress4
  • インフラ4
  • Hugo3
  • .NET Framework1
  • Aurora1
  • Filament1
  • Git1
  • SQS1

Tags

  • C#
  • .NET
  • AWS
  • Laravel
  • PHP
  • セキュリティ
  • MySQL
  • Linux
  • コレクション
  • Apache
  • パフォーマンス
  • Code Snippet
  • DynamoDB
  • NoSQL
  • PHP-FPM
  • RDS
  • System.Collections
  • DoS
  • Nginx
  • Windows
  • WordPress
  • メモリ管理
  • 監視
  • 設計
  • Amazon Linux 2023
  • Docker
  • IDisposable
  • Ipset
  • Iptables
  • OPCache
  • Webサーバー
  • オブジェクト指向
  • クラス設計
  • デザインパターン
  • パターンマッチング
  • 継承
  • 認可
  • Aurora
  • Blade
  • Grafana
  • Hugo
  • InfluxDB
  • Policy
  • Record
  • SSG
  • インターフェース
  • エラーハンドリング
  • カプセル化
  • ガベージコレクション
  • モニタリング
Powered by Hugo & Explore Theme.