ソフトウェア開発に携わるエンジニアの世界では「ガベージコレクション」と言う言葉を聞いたことがあると思います。
しかしながらこの言葉の意味や機能を正確に説明できる人は余り多くありません。
そこでこの記事ではガベージコレクションのおさらいをしましょう。
具体的にはガベージコレクションの用語説明からメリット、発生時の注意点や対処方法までをしっかりと解説します。
ガベージコレクションとは?
ガベージコレクションの語源は英語の「garbage collection」から来ています。日本語にすると「ゴミ回収、廃品回収」と言う意味になります。
一般的には省略して「GC」と呼ぶこともあります。
もう少し説明するとガベージコレクションとは、自動的に不要となったメモリの領域を解放する機能のことです。
つまり、ゴミ(使ってないメモリ)を回収する清掃員の役割がガベージコレクションです。
-
自動的に不要となったメモリの領域を解放する機能のこと(ゴミ(使ってないメモリ)を回収する清掃員の役割)
ガベージコレクションの種類と役割
ガベージコレクションは大別すると2種類あります。
そこで以下に、それぞれの役割について説明します。
Scavenge GC
メモリ上にはプログラムが「使用出来る領域」と「使用出来ない領域」があります。今回ご説明するのは「使用出来る領域」で「ヒープ領域」と言います。
このヒープ領域には新しいデータが格納される「New領域」と古いデータが格納される「Old領域」に区分されます。
New領域 | 新しいデータが格納される |
Old領域 | 古いデータが格納される |
そしてScavenge GCとは「New領域」に限定したメモリを解放するのが役割です。
清掃員の作業に例えると毎日の通常清掃となります。従いまして掛かる時間も少ないです。
Full GC
こちらはヒープ領域にある「Old領域」に限定したメモリを解放するのが役割です。
清掃員の作業に例えると年1回の大清掃となります。従いまして広い範囲を長い時間掛けて行います。
このため、システムのパフォーマンスに影響を与えます。
ガベージコレクションの動作内容
ガベージコレクションが動作する条件は以下の3つです。
システムのメモリ容量が少なくなった場合
検出は、OSあるいはホストPCからのメモリ不足による通知となります。
「マネージドヒープ」で割り当てた使用メモリがしきい値を超えた場合
「マネージドヒープ」とは、ガベージコレクションにより管理されるメモリを指します。
GC.Collectメソッド」が実施された場合
「GC.Collectメソッド」とは、ガベージコレクションを強制実行する命令になります。
この命令は主にテスト時や特別な状況時に使います。
ガベージコレクションの開発前はどうしていたのか?
ここでは、ガベージコレクションが開発される前の処理について解説します。
ガベージコレクションが「自動」だとすると、それ以前は「手動」で行っていました。具体的には、プログラマーがメモリの確保と解放をその都度、プログラムの中に書き込んでいました。
つまり、原始的な方法で解決していたということです。
しかしながら欠点として「メモリーリーク」が発生する恐れがあります。メモリーリークとはプログラムバグのひとつです。
-
プログラムバグのひとつ
本来、プログラムでメモリを適時開放しなくてはなりませんが開放し忘れたため、残ったメモリが消費され続けて結果的にプログラムが止まってしまう状態を指します。
このため、ガベージコレクションが導入される前はプログラマーにある程度のスキルが必要とされていました。
ガベージコレクションの歴史
ガベージコレクションの概要が分かったところで次は歴史について説明します。ガベージコレクションの起源は1959年頃、米国の人工知能学者である「ジョン・マッカーシー」によって開発されました。
現在は、多くのプログラミング言語で本機能が採用されています。
代表的な言語はJava、Python、Rudy、PHP、JavaScript、Kotlin、Swift、Visual Basic等です。
- Java
- Python
- Rudy
- PHP
- JavaScript
- Kotlin
- Swift
- Visual Basic
一方でガベージコレクションを採用していない言語も存在します。
代表的な言語はC、C++、Rust等です。
- C
- C++
- Rust
これらの言語が登場した時期はメモリ容量が少なく、厳格なメモリ管理が必要不可欠でした。この結果、これらの言語でガベージコレクションは採用されていません。
しかしながら現在では、ライブラリを導入することでガベージコレクションを使用することが可能です。
なお、Rustのメモリ管理は所有権・借用・ライフタイムという別の概念を導入しています。
これはメモリの安全性と動作スピードの両立させるためと言われていますが、エンジニアの間では賛否両論を呼んでいます。
ガベージコレクションのメリット
ガベージコレクションの主なメリットは以下の2つになります。
プログラマーの負担軽減
前述した通り、ガベージコレクションが開発される前は個々のプログラマーが独自にプログラムを書き込みメモリ管理を行っていました。
このため、正しいメモリ動作を検証する必要があり、プログラマーに負担を掛けていました。
しかしながらガベージコレクションを導入することでプログラマーはメモリの確保と開放を考慮する必要が無くなりました。
メモリリークの防止
メモリーリークの原因はプログラマーによるプログラムミスが殆どです。
これに対して、ガベージコレクションを採用することでメモリの開放は自動になります。
従ってメモリーリークを確実に防止できることになります。
ガベージコレクションの注意点と対処法
ガベージコレクションは画期的な機能でメリットばかりが注目されてますが、リスクも伴います。
そこでここでは、ガベージコレクションを導入時の注意点と対処法を2つ説明します。
処理が重くシステムを止めてしまう恐れがある
プログラマーは、ガベージコレクションの導入と引換えにメモリ管理のプログラムを意識する必要がありません。
しかしながら、この代償としてプログラマーはメモリの開放を細かく制御できません。
このため、予測しないタイミングでCPUに負担が掛かり、本来のプログラム処理が重くシステムを止めてしまう恐れがあります。
従ってリアルタイム性が要求されるゲーム等のプログラムには、ガベージコレクションを導入するのは不適当です。
メモリ開放の予見が難しい
ガベージコレクションの導入でメモリ管理が自動で行われるため、メモリの開放がいつ実行されるか分からず制御できません。
このため、ガベージコレクションの実行タイミングは予見できません。
従って、Full GCの発生を極力防ぐように十分なメモリの割り当ての考慮が必要です。
まとめ
この記事ではガベージコレクションの用語説明からメリット、発生時の注意点や対処方法までを解説して来ました。
今日、ガベージコレクションは既に多くのプログラミング言語で導入されています。
このため、エンジニア側から見るとあまり意識すること無く使っている機能です。
しかしながらこのガベージコレクションが無い時代には、プログラマーが手動でプログラムしていたと思うと感慨深いものを感じないでしょうか。