基本情報技術者 2017年 秋期 午前(科目A) 問16
問題文
メモリリークの説明として、適切なものはどれか。
選択肢
ア:OSやアプリケーションのバグなどが原因で、動作中に確保した主記憶が解放されないことであり、これが発生すると主記憶中の利用可能な部分が減少する。(正解)
イ:アプリケーションの同時実行数を増やした場合に、主記憶容量が不足し、処理時間のほとんどがページングに費やされ、スループットの極端な低下を招くことである。
ウ:実行時のプログラム領域の大きさに制限があるときに、必要になったモジュールを主記憶に取り込む手法である。
エ:主記憶で利用可能な空き領域の総量は足りているのに、主記憶中に不連続で散在しているので、大きなプログラムをロードする領域が確保できないことである。
メモリリークの説明として、適切なものはどれか。【午前2 解説】
要点まとめ
- 結論→ メモリリークは、確保した主記憶が解放されず使用可能領域が徐々に減少する現象であると理解してください。
- 根拠→ プログラムやOSのバグで解放処理が行われないと、未使用の領域が再利用できず長時間で枯渇します。
- 差がつくポイント→ スラッシングや断片化と混同しないこと、GC下でも参照残存でリークが起こる点を押さえると差がつきます。
正解の理由
正解は ア です。アの選択肢は「動作中に確保した主記憶が解放されないことで利用可能領域が減少する」と明確に述べており、これがメモリリークの定義に一致します。メモリリークでは確保されたメモリがプログラムから参照されなくなっても解放されないため、その領域は以後再利用できず、システム全体の利用可能メモリを徐々に減らします。
よくある誤解
- スラッシング(ページングによる性能劣化)と混同する:スラッシングは主記憶不足でページングが頻発して処理が遅くなる現象で、リークとは原因と症状が異なります。
- 外部断片化と混同する:断片化は空き領域が散在して大きな連続領域が確保できない状態で、総空き量は十分でも割り当て失敗が起きる点でリークとは異なります。
- GCのある言語は無条件に安全だと思う誤解:GCは未参照オブジェクトを回収しますが、プログラムが不要な参照を保持していると「論理的なリーク」が発生します。
解法ステップ
- 設問文で「解放されない」「確保した主記憶」がキーワードか確認する。
- 各選択肢とキーワードを突き合わせ、定義に一致するものを探す。
- 類似する概念(スラッシング、ロードオンデマンド、断片化)を思い出して誤答を除外する。
- 正解候補が1つに絞れたら、その理由を短く確認して確定する。
選択肢別の誤答解説
- ア: ア は正解です。確保した主記憶が解放されず利用可能メモリが減少するという記述はメモリリークの本質を表しています。
- イ: 主記憶容量不足でページングが増え処理が遅くなる現象は「スラッシング(スラッシング現象)」の説明であり、メモリリークの定義とは異なります。
- ウ: 必要になったモジュールを主記憶に取り込む手法は「需要ロード(ロードオンデマンド)/遅延読み込み」の説明で、リークとは無関係です。
- エ: 空き領域が不連続で大きな領域が確保できない状態は「外部断片化(メモリ断片化)」を指し、総量は足りている点でリークとは区別されます。
補足コラム
- 検出と対策例:C/C++では Valgrind や AddressSanitizer で検出、対策として明示的な free/free-like 呼び出しやスマートポインタ(unique_ptr/shared_ptr)の活用が有効です。マネージド言語でも不要な参照を切ることが重要です。
- 実務での注意点:長時間稼働するサービスや組み込み機器は微小なリークでも累積して致命的になるため、定期的なメモリ監視とプロファイリングを行ってください。
コード例(C の単純なメモリリーク)
#include <stdlib.h>
void leak() {
int *p = malloc(100 * sizeof(int));
// 処理後に free を呼ばないためメモリリークが発生
}
int main() {
for (int i = 0; i < 1000000; i++) {
leak();
}
return 0;
}
FAQ
Q1: ガーベジコレクションのある言語でもメモリリークは起きますか?
A1: はい。GCは未参照オブジェクトを回収しますが、不要な参照を保持している場合はオブジェクトが解放されず「論理的なリーク」が起こります。
A1: はい。GCは未参照オブジェクトを回収しますが、不要な参照を保持している場合はオブジェクトが解放されず「論理的なリーク」が起こります。
Q2: メモリ断片化とメモリリークはどこで見分ければよいですか?
A2: 総空き量が減少しているならリーク、総空き量は十分だが連続領域が取れないなら断片化です。ツールで総空き量を確認すると判別できます。
A2: 総空き量が減少しているならリーク、総空き量は十分だが連続領域が取れないなら断片化です。ツールで総空き量を確認すると判別できます。
Q3: 早期に見つける方法は?
A3: 自動テストでメモリ使用量の回帰監視、プロファイラやValgrindでの定期チェック、コードレビューでのリソース管理確認が有効です。
A3: 自動テストでメモリ使用量の回帰監視、プロファイラやValgrindでの定期チェック、コードレビューでのリソース管理確認が有効です。
関連キーワード: メモリリーク、スラッシング、外部断片化、ガーベジコレクション、Valgrind、ロードオンデマンド、メモリプロファイリング

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

