Javaやその他でよく聞く、GarbageCollectionとは?
GarbageCollection(ガベージコレクション、ガーベジコレクション)
GarbageCollectionとは、プログラミング言語で、「意識してコーディングしなくてもメモリ管理を行ってくれる」ものです。
発明までの経緯
低級言語は、メモリ管理までも全てプログラマーの責任でした。例えば、ある変数を使うためには予めメモリを確保してから使い、終わったら解放する処理を呼ぶなどの手間が掛かっていたのです。
ところが、このメモリ管理をプログラマーの責任とすることによって、とある問題が生まれました。
そうです。解放し忘れるのです。
現在のJavaでも、StreamのClose漏れなどは多くあります。メモリリークによるOutOfMemoryエラーには、多くのプログラマーが苦しめられてきたことでしょう。
しかも、このメモリ関係のエラーは、スタックトレースが当てにならないので、調査が非常に大変でした。
なんとかこの煩雑な管理を簡素化できないか?という問題意識のもと、考え出されたのがGarbageCollectionでした。
メモリ掃除役のGarbageCollection
GarbageCollectionが考え出されて以来、プログラマーが意識してメモリを管理する事はなくなりました。
メモリの大容量化もさることながら、メモリの管理を意識しなくても良いということは、多くのプロジェクトの生産性に寄与したのです。
今では、殆どの高級言語にこのシステムが搭載されています。
フルGCとは
GarbageCollectionにより、メモリをプログラマーが管理する必要がなくなり、使い終わった領域は自動的に解放されるようになりました。
しかし、そこに新たな問題が生まれました。メモリのヒープ領域が足りなくなると、強制的に空き領域を増やす、「フルGC」が発動してしまいます。
このフルGCは、怠るとOutOfMemoryエラーを引き起こしてしまうことから、最優先でCPUが割り当てられます。その間、まるでフリーズしてしまったかのようにアプリケーションが応答しなくなってしまうのです。
メモリ不足が深刻化した末期には、このフルGCが絶え間なく起こり、最後にはメモリ不足でシステムがクラッシュします。
これは、多くの場合メモリを充分に積み、ヒープ領域を多く設定すれば解決される事なのですが、稀にあるリソースの解放漏れや、キャッシュを際限なく溜めていった場合など、プログラム側でのバグに起因するものの場合もあり、追跡は困難を極めることとなります。
まとめ
GarbageCollectionは、非常に便利なものですが、未だにメモリ管理をプログラマの責任において行わなければならないケースがあります。
適切な管理を行うことで、アプリケーションのパフォーマンスを向上させることもできますので、フルGCが起こってしまった場合は、アプリケーションの設計を見直してみましょう。