今回のテーマは「メモリリーク」と「ガベージコレクション」です。
メモリリーク?
基本情報技術者試験や応用情報技術者試験で出題される「メモリリーク」と「ガベージコレクション」の問題。聞きなれない言葉で難しく感じるかもしれませんが、言葉の意味を理解すればそこまで難しい問題ではありません。
また、ITエンジニア(特にプログラマー)であれば、知っておきたい知識です。
本記事では、「メモリリーク」と「ガベージコレクション」について図解を用いて分かりやすく解説しています。
スポンサーリンク
目次
メモリリーク
メモリリークとは
メモリリーク(英:memory leak)とは、プログラムが確保したメモリ領域の一部 または すべてを解放し忘れ、確保したまま放置してしまうことであり、プログラミングにおけるバグの一種です。
通常プログラムは、次の図のように主記憶装置(メインメモリ)から必要な領域を確保します。そして、役割を終えて不要になったタイミングで確保したメモリ領域を解放し、空き領域に戻します。
プログラムの記述ミスなどにより解放処理を怠ると、不要になったプログラムがメモリ領域を確保したままになってしまいます。
この現象がメモリリークです。
メモリリークが頻発すると、メモリの空き領域が減少し、実行中プログラムの動作が遅くなったり、異常終了したりします。
メモリの解放を忘れるとメモリリークが発生し、メモリの利用可能領域が少なくなっていきます。
ガベージコレクション
ガベージコレクション
ガベージコレクション(英:garbage collection、略:GC)とは、コンピュータプログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放し、空き領域として再利用できるようにすることです。
次の図は、ガベージコレクションのイメージ例です。
使わなくなった物(ゴミ)を掃除して部屋を綺麗にするイメージです。
従来のプログラミング言語は、プログラマーが明示的にメモリの解放を行う必要がありましたが、Javaのようにガベージコレクションが組み込まれているプログラミング言語やフレームワークの場合は、実行中プログラムの動作から不要になったと判断した領域を自動的に解放します。
しかし、不要であると機械的には判断されずなかなか解放されないこともあります。(どこからも参照されなくなったものは解放するが、参照が残っている場合は解放されない)
また、長期間実行状態を維持するプログラムや、高頻度でメモリの確保・解放を繰り返すプログラムはメモリリークが発生しやすいので注意が必要です。
そのためプログラマーは、プログラミング言語によって用意されている解放処理を確認し、リソースの解放を忘れずに行うことが大切です。
ガベージコレクションが組み込まれているプログラミング言語でも、必要に応じてリソースの解放はしっかり行いましょう。
基本情報技術者試験 過去問の解説
スポンサーリンク
基本情報技術者平成29年秋期 午前問16
メモリリークの説明として,適切なものはどれか、設問のア~エを順番に確認していきます。
ア:OSやアプリケーションのバグなどが原因で,動作中に確保した主記憶が解放されないことであり,これが発生すると主記憶中の利用可能な部分が減少する。
正解:メモリリークの説明。
イ:アプリケーションの同時実行数を増やした場合に,主記憶容量が不足し,処理時間のほとんどがページングに費やされ,スループットの極端な低下を招くことである。
不正解:スラッシングの説明。スラッシングとは、主記憶容量の空き領域が少ないとき、主記憶とストレージとの間で内容の入れ替え(ページング/スワッピング)が頻繁に起き、処理がなかなか進まない状態のこと。(優先度の低いプログラムを一時的にストレージに退避させ、主記憶に空き領域を作る)
ウ:実行時のプログラム領域の大きさに制限があるときに,必要になったモジュールを主記憶に取り込む手法である。
不正解:オーバーレイ方式の説明。オーバーレイ方式とは、プログラムをセグメントという単位に分割し、その時に必要なセグメントだけを主記憶にロードする方式のこと。
エ:主記憶で利用可能な空き領域の総量は足りているのに,主記憶中に不連続で散在しているので,大きなプログラムをロードする領域が確保できないことである。
不正解:フラグメンテーションの説明。フラグメンテーションとは、主記憶の空き領域単位が小さく分割されてしまい、そのままでは有効活用できない状態のこと。
「ア」が正解です。
基本情報技術者平成16年秋期 午前問32
設問の現象と一致するものはどれか解答のア~エを順番に確認していきます。
正解:ガーベジコレクションとは、コンピュータプログラムが動的に確保した記憶領域のうち、不要になった領域を自動的に解放し、空き領域として再利用できるようにすること。
イ:スタック
不正解:スタックとは、データ構造(データを格納する入れ物)の一つで、入ってきたデータを順番に格納し、最後に格納したデータから順に取り出す方式のこと。
ウ:ヒープ
不正解:ヒープとは、プログラム上から動的(任意)に確保できるメモリ領域のこと。
不正解:フラグメンテーションとは、主記憶の空き領域単位が小さく分割されてしまい、そのままでは有効活用できない状態のこと
「ア」が正解です。