新人PGとの書簡 メモリーリークのしくみ

Tさん、お疲れさまです。

 では、私が実際に遭遇して解決したメモリーリークの事例を紹介します。メモリリークには何度か遭遇しました。
それらは、みな同じ原因から起きていました。それは単に「VMがシステムリソースを解放してくれると勘違いしていたため」です。
あるいは、VMが管理するJava(あるいは.Net)の稼働系内のメモリ空間と、システムリソースの使うメモリ空間との区別が付いていないため、と言えます。

 あるオブジェクトがシステムリソースを握っているかどうかは、Java VM(仮想マシン)には感知できません。
システムリソースは、PCのメモリ、HD、ネットワーク、CPU、DBなどJavaの世界の外側の資源をさします。
なので、JavaのVMはそれらを感知しません。

 そのため、プログラムで明示的にリソースを解放しなかったらメモリーリークを起こす原因となります。
そのオブジェクトへの参照が無くなり、オブジェクトが消滅したら二度とそのメモリを解放できないからです。
この事は、Java以外の全ての処理系で同じように言えます。.NetはもとよりPHP、C++なんでも同じです。

 また、リソースを使ったらすぐ解放する事がいかに大事かを知らないPGも多いと思います。
そのうちVMが解放してくれればいいというのでは、高負荷がかかった時にVMが対処しきれなくなります。
Javaや.Netで高負荷な状態でも問題なく長時間稼働し続けるシステムを提供するには、システムリソースを使用したら即座に解放する事が必要です。

 事例までなかなか話が進まなくてすみません。次回は実際の事例を披露します。

Posted in