CodeGym /Java Blog /ランダム /ガベージ コレクターの詳細
John Squirrels
レベル 41
San Francisco

ガベージ コレクターの詳細

ランダム グループに公開済み
やあ!前回のレッスンでは、まず Java の組み込みガベージ コレクターについて学び、それがどのように機能するかについて大まかに理解しました。プログラムの実行中にバックグラウンドで動作し、後で削除される不要なオブジェクトを収集します。したがって、将来新しいオブジェクトを作成するために使用できるメモリが解放されます。
ガベージ コレクターの詳細 - 1
このレッスンでは、その仕組みについて詳しく説明します。たとえば、オブジェクトはいつどのようにして不要になるのでしょうか? そしてガベージコレクターはどうやってそれを知るのでしょうか?これらは今日のレッスン中に答えられる質問です :) レッスンは概要のようなものになります。この内容を暗記する必要はありません。この主な目的は、メモリとガベージ コレクターがどのように機能するかについての視野を広げることです。したがって、ただ読んで、自分にとって新しい何かを見つけてください :) さあ、いきましょう! 最初に覚えておく必要があるのは、ガベージ コレクターはプログラムと並行して動作するということです。。それはあなたのプログラムの一部ではありません。個別に実行されます (前回のレッスンでは、これをロボット掃除機と比較しました) しかし、常にそうであったわけではありません。ガベージ コレクションは、プログラムと同じスレッドで実行されていました。一定のスケジュール (数分に 1 回) で、ガベージ コレクターはプログラム内に不要なオブジェクトが存在するかどうかをチェックします。問題は、このチェックとガベージ コレクション中にプログラムがハングする (実行されない) ということでした。あなたがオフィスに座って仕事をしているところを想像してみてください。しかし、その後、掃除婦が床を洗いに来ます。彼女はあなたを 5 分間コンピューターから遠ざけ、あなたは彼女が掃除を終えるまで待ちます。この間は仕事ができなくなります。これが、かつてのガベージ コレクションの仕組みです :) このメカニズムは後に変更され、現在はガベージ コレクタがバックグラウンドで実行されるようになりました。プログラム自体の動作を妨げないこと。オブジェクトは参照がなくなると消滅することはすでにご存知でしょう。実際には、ガベージ コレクターはオブジェクト参照をカウントしません。まず、これには長い時間がかかる可能性があります。第二に、あまり効果的ではありません。結局のところ、オブジェクトは相互に参照できます。 ガベージ コレクターの詳細 - 2この図は、3 つのオブジェクトが相互に参照しているが、他のオブジェクトは参照していない例を示しています。言い換えれば、プログラムの残りの部分ではそれらは必要ありません。ガベージ コレクターが単純に参照をカウントした場合、これら 3 つのオブジェクトは収集されず、メモリは解放されません (これらのオブジェクトへの参照は存在します)。これを宇宙船に例えることができます。飛行中、宇宙飛行士は修理に利用できるスペアパーツのリストを確認することにしました。とりわけ、彼らは普通の車のハンドルとペダルを見つけました。明らかに、これらはここでは必要なく、不必要にスペースを占有しています (ただし、これら 2 つの部分は相互に関連しており、いくつかの機能があります)。しかし、宇宙船内ではそれらは廃棄されるべき無用のゴミです。したがって、Java では、参照カウントに基づいてガベージを収集することが決定されました。到達可能と到達不能。オブジェクトが到達可能かどうかをどのように判断するのでしょうか? それはすべて単純に独創的です。オブジェクトは、別の到達可能なオブジェクトによって参照されている場合に到達可能です。したがって、「到達可能性の連鎖」が得られます。プログラムの開始時に開始され、プログラムの継続時間中継続します。次のようになります。 ガベージ コレクターの詳細 - 3 図内の矢印は、プログラムの実行可能コードを示します。コード (メソッドなどmain()) はオブジェクトへの参照を作成します。これらのオブジェクトは他のオブジェクトを参照したり、それらのオブジェクトがさらに他のオブジェクトを参照したりすることができます。これにより参照チェーンが形成されます。オブジェクトから「ルート参照」(実行可能コード内で直接作成された参照) まで連鎖的にたどることができれば、その参照は到達可能であるとみなされます。そのようなオブジェクトは、画像では黒くマークされます。ただし、オブジェクトがこのチェーンから外れると、そのオブジェクトは到達不能になります。つまり、現在実行されているコード内のどの変数もそのオブジェクトを参照しておらず、「参照チェーン」を通じてオブジェクトに到達することはできません。私たちのプログラムでは、そのような 2 つのオブジェクトが赤色でマークされています。これらの「赤い」オブジェクトは相互に参照していることに注意してください。しかし、前に述べたように、Java の最新のガベージ コレクターは参照をカウントしません。オブジェクトが到達可能か到達不能かを決定します。。その結果、図の 2 つの赤いオブジェクトを捕らえます。それでは、最初から最後までプロセス全体を見てみましょう。そうすることで、Java でメモリがどのように配置されるかもわかります:) すべての Java オブジェクトは、ヒープと呼ばれるメモリの特別な領域に格納されます。日常用語では、ヒープとは通常、あらゆるものが混在しているアイテムの山を指します。しかし、Java におけるヒープはそうではありません。その構造は非常に論理的で合理的です。 ある時点で、Java プログラマーは、すべてのオブジェクトが単純なオブジェクト「長期存続するオブジェクト」の 2 つのタイプに分類できることに気づきました。。「長命オブジェクト」とは、ガベージ コレクションが何度も行われても生き残ったオブジェクトです。彼らは通常、プログラムが終了するまで生きます。最終的に、すべてのオブジェクトが格納されるヒープ全体がいくつかの部分に分割されました。最初の部分には美しい名前が付けられています:エデン(聖書「エデンの園」より)。オブジェクトが作成された後に最終的にそこに置かれるため、この名前は適切です。これは、キーワード new を使用したときに新しいオブジェクトが作成されるメモリの部分です。たくさんのオブジェクトが作成される可能性があります。この領域のスペースがなくなると、最初の「高速」ガベージ コレクションが開始されます。ガベージコレクターは非常に賢いと言わざるを得ません。ヒープにガベージ オブジェクトが多いか、ライブ オブジェクトが多いかに基づいてアルゴリズムが選択されます。ほとんどすべてのオブジェクトがガベージである場合、コレクターは生きているオブジェクトをマークし、それらをメモリの別の領域に移動します。その後、現在のエリアが完全にクリアされます。ガベージがあまりなく、ヒープの大部分がライブ オブジェクトである場合、コレクタはガベージにマークを付けてクリアし、他のオブジェクトを一緒にパックします。私たちは言った "サバイバルスペース生存空間は世代ごとに分割されます。各オブジェクトは、ガベージ コレクションが何回生き残ったかに応じて、特定の世代に属します。オブジェクトが 1 ラウンドのガベージ コレクションを乗り越えた場合、そのオブジェクトは「世代 1」になります。5 の場合は「第 5 世代」。eden とサバイバル スペースを合わせて、若い世代と呼ばれるエリアを形成します。若い世代に加えて、ヒープには古い世代と呼ばれる別のメモリ領域があります。。これはまさに、ガベージ コレクションを何度も乗り越えた長命オブジェクトが最終的に到達する領域です。それらを他のすべてから分離しておくことには利点があります。フル ガベージ コレクションは、古い世代がいっぱいになった場合、つまりプログラム内に寿命の長いオブジェクトが多すぎてメモリが不足した場合にのみ実行されます。このプロセスには、複数のメモリ領域が関係します。一般に、これには Java マシンによって作成されたすべてのオブジェクトが含まれます。当然のことながら、これにはさらに多くの時間とリソースが必要になります。これはまさに、寿命の長いオブジェクトを個別に保管するという決定が下されたためです。「クイックガベージコレクション」は、他の領域のスペースが不足したときに実行されます。これには 1 つの領域のみが関与するため、より高速かつ効率的になります。最後に、長命オブジェクトの領域さえも完全に埋まると、フルガベージコレクションがトリガーされます。したがって、コレクターは、回避できない場合にのみ「最も重い」ツールを使用します。以下はヒープ構造とガベージ コレクションを視覚的に表現したものです。 ガベージ コレクターの詳細 - 4
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION