.net column

.NET開発者のためのブログメディア
メモリ

.NET Frameworkのメモリリークはなぜ起きる?対処方法はあるのか?

2020年04月14日

ガベージコレクションは不要なメモリを.NET Frameworkが自動で解放する機能です。これにより、.NET Frameworkで動作するプログラムでメモリリークは発生しにくいといわれています。しかし、すべてがガベージコレクションの対象かといえば、そうではありません。自動的に解放されずに、プログラムが実行されるたびにメモリ領域を占有すれば、当然ですがメモリリークは発生します。ここで、.NET Frameworkのメモリリークについて確認していきましょう。

PG
メモリリークが発生したら大変そうですね。ガベージコレクションが搭載されているからといって、メモリに関しての知識はおろそかにできないですよね。
PL
メモリはアプリケーション開発で重要な部分です。メモリ管理の知識がなくては良いアプリケーションはできないといっていいでしょう。

メモリリークの概要とその原因

IT開発者の初心者向け研修で、はじめに習うのはメモリに関してのことだと思われます。メモリはよく作業領域といわれますが、開発したプログラムを動作させるためにメモリは必要不可欠です。このメモリは有限資源ですので、使用し過ぎるといずれ使える領域が枯渇してしまい、プログラムが実行できなくなります。この現象を「メモリリーク」と呼びます。

.NET Frameworkではガベージコレクションが働くため、不要なメモリ領域は自動で解放可能です。そのため、ガベージコレクションが対象外の領域でメモリリークは発生することが多いといえます。
また、必要なくなったにもかかわらず、メモリ領域がプログラムの一か所からだけでも参照されていれば、そこは残り続けることになります。

以下、メモリリークが発生する主な原因です。

    1. 静的メンバーを利用している

staticキーワードがある場合は静的メンバーです。ガベージコレクションの対象となるのは、ヒープ領域にあるオブジェクトです。静的メンバーは対象外のため、静的領域に残り続けることになります。
領域の説明

  1. Disposeメソッドを呼び出していない
  2. 不完全なDisposeメソッドを利用している
  3. WindowsフォームでBindingSourceコンポーネントの使い方を間違えている

メモリリークの対処法

以下でメモリリークを防ぐ方法をいくつか挙げます。

  1. なるべくusing ステートメントを活用して、ステートメントが抜けたら自動でDisposeメソッドが発動されるようにする
  2. オブジェクトがイベントを生成する必要がなくなったら、そのオブジェクトに対して、NullやNothingを設定する
  3. 不要なイベントは呼び出さないようにする
  4. オブジェクトの利用者側で破棄するのではなく、オブジェクトを作成した側で破棄するようにする
PG
C#は、ガベージコレクションが搭載されていて良かったです。なければ解放漏れを起こして絶対にメモリリークを発生させてしまいそうです。
PL
C言語など、ガベージコレクションが搭載されていない言語で開発する場合、メモリの解放は開発者自身に委ねられます。.NET Frameworkではガベージコレクションが搭載されていますが、メモリの解放に関しては自らが意識してコーディングすることが必要ですよ。

メモリリークは極力発生させてはいけません

自分のPCだけで発生したメモリリークは、再起動すれば解決できます。しかし、基幹システムなどサーバーで動作するプログラムでは、再起動は簡単にできません。メモリリークが発生したら、システム稼働全体に影響を及ぼしてしまいますので、仕様書通りに開発するのはもちろんですが、使用メモリの観点からの開発も忘れずに行うようにしましょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)