ガベージコレクション-その①-


目的

初学の段階では全く意識しなかったインスタンスの取り回しについて考えるため、まずはガベージコレクションなどのJavaの基本的な仕様を抑える

ガベージコレクションとは?

プログラム実行時にJVMに割り当てられたメモリ容量を管理し、メモリリークが生じないように適宜メモリ領域を解放する機能

なんでメモリを解放しなくちゃいけないの?

Javaに限らずプログラミングにおいて、Fig1に示すように、各種変数や命令文などはメモリなどに格納されて、適宜CPUにおいて処理される。格納される際は当然メモリの記憶容量を消費するため、プログラムに割り当てられた容量を超えないように不必要になった変数や命令を消してやる必要がある。

→容量を超えたら…(Javaの場合)OutOfMemoryError が出てプログラムが強制終了してしまう

この時、C言語などではプログラマ側がコード中に明示的にメモリの領域を解放してやらないといけなかったが、Javaなどのオブジェクト指向言語やHaskell等の関数型プログラミング言語においては、Fig.2で示すように今回話題にするガベージコレクションという機能が備わっており、メモリ管理をほぼ自動で行ってくれる。

自動的にやってくれるならプログラマは何も気にしなくていいんじゃないの?

ところがどっこい、GCが動作する最中でもプログラムは動いている為、適当に不必要なものを消されてしまっては困る。そのため「不必要」の一定の基準を設け、それに従いGCを機能させており、Javaの場合は下記の要素で判定をしている。

・他のどの要素からも参照されていない

したがって、設計によってはメモリリークが生じる可能性もある。
また、GCが動作する頻度などによって下記の不具合がでることがある

・GCが頻発することで処理が滞る

GCが動作する最中はアプリケーションは一時的に停止状態になってしまうため、頻繁にGCが起こってしまうと不具合を生じる。また、単純にGCの停止時間が長くなる場合もある。
さらには、これは次回記述する予定だがGCにも種類があり、その仕様によってはGCが動作してもメモリが解放されずメモリリークが生じてしまうこともある。

次回予告

JavaVMにおけるGCとは