メモリリーク(Memory leak)って言葉は良く出てきますが、言葉だけだと悪いイメージがありますよね。
そう、メモリリークはプログラミングにおけるバグの一種なんです!今回はこのメモリリークが何故起きて、その時の対処はどうすべきかを解説します。
メモリリークはどんなバグなのか?
先ずはメモリリークの説明になります。簡単に言うと、コンピュータ上の各プログラムが動作した際にメモリを確保しますが、プログラム終了後にそのメモリを解放し忘れることです。
メモリを作業机に例えることが良くありますが、みんなで使う机を自分が使った後に、後片付けをしないで、そのまま自分の荷物を置いたままにするようなものです。これは非常に悪い行為です!
メモリリークは同様にメモリをプログラムが確保したままにしてしまい、そのメモリ領域を他のプログラムが使えない状態にしてしまうことです。
一つの小さなプログラムによるメモリリークであれば、それほどコンピュータへの影響は無いのですが、このプログラムが何回も起動し、その度にメモリリークが繰り返して起こるとメモリが大量に消費されるため、その結果他のプログラムやOSがメモリを確保できなくなってしまいます...
そして、最終的にはプログラムやOSがメモリを確保しようとした時にエラーを引き起こしたり停止したりしてしまいます...最終的にはOSの強制シャットダウンになってしまいます(涙)
メモリリークが発生し易い状態は以下のようなパターンがあります。
- プログラムが長期間動き続けるときです。サーバーサイドアプリケーションや組み込みシステムは年単位で稼働し続けることもあります。
- 組み込みシステムやポータブル機のように、メモリの絶対量が少ない時です。
- 共有メモリのような、確保したまま終了することが許されるメモリ領域をプログラムが使っているときです。
メモリリークの発生原因は?
では、どうやったらメモリリークが発生するのでしょうか?これは意外と簡単です。
メモリリークを防ぐ方法
プログラマによる単純なプログラムミス(メモリ開放の宣言をしない!)
wikiにはプログラムの論理的欠陥も原因の一つと書いてあります。論理的欠陥とはOSのメモリ管理システムの不具合とかですね。
例えば、C言語やC++言語における関数malloc()で動的に確保されたメモリ領域は、それに対応する関数free()の呼び出しでプログラム終了後に解放するのが基本的な流れですが、アプリケーションプログラムが動的に確保したメモリ領域を解放する、つまりfree()の記述を忘れていると、そのメモリ領域はシステムのメモリ資源を無駄に占有し続けることになってしまいます...
対応策は?
対応策は基本中の基本である「正しいプログラミングをしっかりやる」なのですが、やはり人間がやる作業なのでミスはあります。
そのためにJava などのプログラミング言語では、アプリケーションでメモリを確保しているオブジェクトが不要になった時点で Java がそれを削除してくれます!
この仕組みが有名な「ガベージコレクション」です!
これによって、メモリリークは発生しなくなって良かった!と思いますが、そんなにうまい話でも無く、ガベージコレクションがあってもメモリリークは発生してしまいます...詳しいことは以下サイトをご参照ください。
まとめ
今回はメモリリークの中身と発生原因、対処方法に関して解説しました。
みんなで使う場所は使い終わったら個人個人がしっかりと掃除するのが、どこの世界でも大事なんですね!
特に長期間連続稼働するサーバ側で動くプログラムはメモリリークにならないよう定期的にメモリのリソースを確認して、メモリリークが起きてそうなら早期に解決した方が良いですね。
因みにメモリリークという言葉は「システムのメモリがどこかから漏れて(リーク)足りなくなってゆく」という意味だそうです。
以上です!
参考URL)