5分で分かるガベージコレクションの仕組み
「ガベージコレクション」という言葉を耳にされたことはございますでしょうか。「聞いたことはあるけど、それがどんなものかよく理解していない」という方は多いかと思います。こちらでは、「ガベージコレクション」の正体を分かりやすく解説致します。
ガベージコレクションとは?
今回はガベージコレクションを「掃除のおばちゃん」に例えてご説明致します。実はガベージコレクションとは、プログラムにおける掃除のおばちゃんのような存在なのです。なぜ、ガベージコレクションが掃除のおばちゃんに例えられるかを、「プログラム実行時にメモリ上ではどのようなことが起こっているか」の解説を通して、お伝え致します。
プログラムが動作する際には以下2つのステップを踏みます。
- プログラム処理に必要な情報をメモリ上に読みこむ
- 読みこんだ情報をもとに、処理を実行する
読みこまれた情報は、処理をしている間はもちろん必要なものですが、その処理が終わってしまうと途端に不要になってしまいます。つまり「メモリに残されたゴミ」のような状態になってしまうのです。
そこで登場するのが、掃除のおばちゃんこと「ガベージコレクション」となります。
こちらは、「プログラムが確保したメモリ領域のうち、不要になった箇所だけを解放してくれる」機能となります。必要に応じてメモリ領域を割り当て・開放等することを「メモリ管理」と言います。
しかしガベージコレクションは、プログラマがメモリ管理のためのコードをわざわざ書かなくても、「この領域は必要かそうでないか」を自動的にチェックしてくれます。JavaやPHPのような高級言語は、こちらのガベージコレクションを標準機能として備えていることが多いです。
ガベージコレクションが登場する前
それでは、ガベージコレクションが登場する前にはどのようにメモリ管理が行われていたのでしょうか。
実は、プログラマ自身がメモリの確保と開放を行うためのコードを都度書いていたのです。現在でも、ガベージコレクションの搭載されていないC言語などでは、プログラマはその処理を都度行っています。
しかし、欠点として、この方法はバグを多く生み出します。
「処理が終わったのにもかかわらず、メモリを開放し忘れる」というミスが起こりかねないのです。この状態になってしまうと、プログラムが実行されるたびにメモリ上に余分なデータが溜まり続けます。
そうして最終的には、使用可能なメモリを食いつぶしてしまい、プログラムが動作不可能な状態となってしまうのです。これを「メモリリーク」と呼びます。メモリリークは熟練したプログラマでも回避するのは困難でした。しかし、ガベージコレクションによってメモリ管理を常に意識しなくてもよくなり、プログラミングの敷居がぐっと低くなったのです。
Scavenge GCとFull GC
ガベージコレクションには、大きくわけて2つの種類があります。それは、「Scavenge GC(スキャベンジ・ジーシー)」と「Full GC(フル・ジーシー)」です。
それでは、それぞれの違いを順に見ていきましょう。
Scavenge GC
「あるプログラムが使用できるメモリ領域」のことを「ヒープ領域」と言います。そして、このヒープ領域はさらに「New領域」と「Old領域」に分けられるのです。
New領域には生成されたあとすぐに廃棄されるオブジェクトが入り、Old領域にはさらに長い寿命を持つオブジェクトが入ります。Scavenge GCはそのうちNew領域のみを対象としたもので、比較的短時間で終了します。
掃除のおばちゃんを例にする場合、「テーブルの上やフロアだけをサッと掃除する」ような状態です。
Full GC
一方のFull GCは、Old領域をふくむ全領域を対象にしたものとなります。
(状況によっては、一部領域が除外されます)Scavenge GCほど高頻度では発生しないかわりに、終了するまでに時間がかかります。
これも掃除のおばちゃんを例にする場合、「部屋全体の大掃除をする」といったイメージとなります。
ガベージコレクションによるパフォーマンスへの影響
Webアプリケーションのように、「ほんの少しだけレスポンスが遅くなるのは許容できるけれど、システムそのものが数秒~数十秒間停止してしまうのは避けなければいけない」という条件がある場合、Scavenge GCは発生してよくても、Full GCが発生することは何としても防がなければいけません。
それは非常に重い処理であるため、システムのパフォーマンスに大きな影響をあたえてしまうからです。
Full GCをおさえるには、具体的には次のような点に注意することが必要になります。
オブジェクトをできるだけ使い回さないこと
オブジェクトの寿命が長くなるため、Old領域にわり当てられる可能性が高くなります。Old領域がふえればふえるほど、Full GCが発生しやすいのです。
新しいオブジェクトを大量に使用する場合は、New領域を大きめにとること
プログラムの起動オプションなどで指定可能です。
これも同じように、Old領域に割り当てられるオブジェクトを少なくする意図があります。
※ただし一部のゲームアプリのように、ほんのわずかの処理速度遅延が許容できないときには、このケースが当てはまらない場合があります。
おわりに
普段あまり意識することのない「ガベージコレクション」という機能。
そこには、私たちの代わりにせっせとゴミを回収してくれている掃除のおばちゃんが住んでいます。
耳をすませば、無機質なソースコードのすき間から、おばちゃんの声が聞こえてくるかもしれませんよ。
ギークスジョブはITフリーランス専門エージェントとして20年以上にわたり、ITフリーランスのご支援を行っています。
フリーランスを初めて検討される方はもちろん、現在フリーランスとしての今後に不安を感じている方、今よりもっと充実したフリーランス生活を楽しみたい方は、ぜひお気軽に相談ください。ITフリーランス専任のキャリアアドバイザーがマンツーマンでサポートいたします。
▽ 無料登録(エントリー)はこちら
https://geechs-job.com/entry
まだフリーランスになることに迷いがある方へは、独立のご相談から承ります。これまでのご経歴やキャリアの目標をお伺いしながら、お一人おひとりに寄り添ったキャリアプランのご提案をいたします。
▽ 独立相談会への無料エントリーはこちら
東京:https://geechs-job.com/event/details/1
大阪:https://geechs-job.com/event/details/2
福岡:https://geechs-job.com/event/details/3
名古屋:https://geechs-job.com/event/details/189
その他のおすすめ記事
5分で分かるJavaデザインパターン|ITフリーランスをサポートするギークスジョブ
ITフリーランスの方のための『お役立ち情報』をご紹介しています。この情報のテーマは5分で分かるJavaデザインパターンです。geechs job(ギークスジョブ)では、「フリーに生きる」ためのノウハウをご紹介し、ご希望のキャリアやライフプランを実現できるように、サポート致します!
ITフリーランスの案件探しならgeechs job
IT業界・企業情報の専門知識を持ったコーディネーターが、あなたに合う案件をご紹介。
ITエンジニアとしてのキャリアに弾みを付けませんか?
- ・独立して新しいキャリアを築きたい
- ・スキルを磨いて、更なる高みを目指したい
- ・今よりも高い報酬を
ITフリーランスエージェントのgeechs jobが、あなたの未来に向けて伴走します。