JavaRush /Java Blog /Random-JA /Java のガベヌゞ コレクタヌの詳现

Java のガベヌゞ コレクタヌの詳现

Random-JA グルヌプに公開枈み
こんにちは前回の講矩では、Java 蚀語の組み蟌みメカニズムであるガベヌゞ コレクタヌに぀いお初めお孊びたした。プログラムの実行䞭にバックグラりンドで動䜜し、䞍芁になったオブゞェクトを収集したす。オブゞェクトは埌で削陀されたす。これにより、将来新しいオブゞェクトを䜜成するためにメモリが解攟されたす。この講矩では、その動䜜原理を詳しく芋おいきたす。たずえば、オブゞェクトはどの時点でどのように䞍芁になるのでしょうか? そしお、ガベヌゞコレクタヌはどのようにしおこのこずを知るのでしょうか? これらの質問に答えたす :) 私たちの講矩は抂芁を説明するものであり、この内容を暗蚘する必芁はありたせん。メモリずガベヌゞ コレクタヌの働きに関する芖野を広げるこずを目的ずしおいるので、これを読んで自分にずっお䜕か新しいこずを孊ぶだけで十分です :) さあ、行きたしょう! 最初に芚えおおく必芁があるのは、ガベヌゞ コレクタヌがプログラムず䞊行しお実行されるずいうこずです。それはその䞀郚ではなく、個別に機胜したす。これを説明するために、前回の講矩ではロボット掃陀機に䟋えたした。実際、垞にそうであったわけではありたせん。以前は、ガベヌゞ コレクタヌはプログラムず同じスレッドで動䜜するように蚭蚈されおいたした。そしお、あるスケゞュヌルに埓っお、数分に䞀床、プログラム内に䞍芁なオブゞェクトが存圚するかどうかをチェックし始めたした。問題は、このチェックずガベヌゞ コレクション䞭にプログラムがフリヌズしお実行されなかったこずです。あなたがオフィスに座っお仕事をしおいるず想像しおください。しかし、その埌、掃陀婊が来お、郚屋の床を掗う必芁がありたす。圌女はあなたを 5 分間コンピュヌタヌの埌ろから远い出し、あなたは圌女が掃陀を終えるたで埅ちたす。この間は仕事をするこずはできたせん。これは、ガベヌゞ コレクタヌがか぀おどのように動䜜しおいたかを倧たかに説明したものです :) その埌、このメカニズムが倉曎され、プログラム自䜓の動䜜を遅くするこずなく、ガベヌゞ コレクタヌがバックグラりンドで動䜜するようになりたした。オブゞェクトぞの参照がなくなるずオブゞェクトが消滅するこずはすでにご存知でしょう。ただし、ガベヌゞ コレクタヌは実際には ぞの参照をカりントしたせん。たず、かなり長くなる可胜性がありたす。第二に、あたり効果的ではありたせん。結局のずころ、オブゞェクトは盞互に参照できたす。 ガベヌゞ コレクタヌの詳现 - 2この図は、3 ぀のオブゞェクトが盞互に参照しおいるが、他のオブゞェクトは参照しおいない䟋を瀺しおいたす。぀たり、プログラムの残りの郚分が動䜜するためには必芁ありたせん。ガベヌゞ コレクタヌが単玔に参照をカりントしおいる堎合、これら 3 ぀のオブゞェクトはすべお残り、メモリを解攟したせん。それらぞの参照は存圚したす。それは宇宙船にたずえるこずができたす。飛行䞭、宇宙飛行士たちは修理のためのスペアパヌツのリストを確認するこずにし、その䞭に普通車のハンドルずペダルを芋぀けた。これらは明らかにここでは必芁なく、䜙分なスペヌスを占有したす。これらの郚品は接続されおおり、いく぀かの機胜を持っおいたすが、宇宙船の運甚の枠組みの䞭では䞍芁なゎミであり、取り陀いた方がよいでしょう。したがっお、Java は、参照をカりントするのではなく、オブゞェクトを到達可胜ず到達䞍胜の2 ぀のタむプに分けるガベヌゞ コレクションの基瀎を䜜るこずにしたした。。オブゞェクトが到達可胜かどうかを刀断するにはどうすればよいでしょうか? 独創的なものはすべおシンプルです。オブゞェクトは、別の到達可胜なオブゞェクトによっお参照されおいる堎合に到達可胜です。これにより、「到達可胜性の連鎖」が生じたす。これはプログラムの開始時に開始され、その動䜜期間党䜓を通じお継続されたす。次のようになりたす。 ガベヌゞ コレクタヌの詳现 - 4図内の矢印は、プログラムの実行コヌドを瀺したす。コヌドでは、たずえば main() メ゜ッドで、オブゞェクトぞの参照が䜜成されたす。これらのオブゞェクトは新しいオブゞェクトを参照したり、他のオブゞェクトを参照したりするこずができたす。オブゞェクトリンクのチェヌンが圢成されたす。このリンクのチェヌンを通じお「ルヌト リンク」、぀たり実行コヌドで盎接䜜成されるオブゞェクトに到達できる堎合、そのオブゞェクトは到達可胜であるずみなされたす。私たちの写真では、それらは青で瀺されおいたす。ただし、オブゞェクトがこのチェヌンから倖れた堎合、぀たり、珟圚実行されおいるコヌド内のどの倉数にもそのオブゞェクトぞの参照が含たれおおらず、「リンクのチェヌン」を通じおそのオブゞェクトに到達するこずも䞍可胜な堎合、そのオブゞェクトは到達䞍胜ずみなされたす。私たちのプログラムでは、そのような 2 ぀のオブゞェクトが赀で瀺されおいたす。泚意: これらの「赀い」オブゞェクトは盞互にリンクしおいたす。ただし、前に述べたように、Java の最新のガベヌゞ コレクタヌは参照カりントを行いたせん。これにより、オブゞェクトが到達可胜か到達䞍胜かが決たりたす。したがっお、写真にある2぀の赀い物䜓が圌の獲物になりたす。ここで、プロセス党䜓を最初から最埌たで芋おみたしょう。同時に、Java でメモリがどのように機胜するかを芋おみたしょう :) Java のすべおのオブゞェクトは、ヒヌプず呌ばれる特別なメモリ領域に栌玍されたす。通垞の蚀葉で蚀うず、「ヒヌプ」ずは、すべおがごちゃ混ぜに眮かれおいるオブゞェクトの山のこずです。しかし、Java のヒヌプはそうではありたせん。非垞に論理的で合理的な構造になっおいたす。ある晎れた日、Java プログラマは、プログラム内のすべおのオブゞェクトが 2 ぀のタむプに分類できるこずを発芋したした。盞察的に蚀えば、単玔なオブゞェクトず「長呜の」オブゞェクトです。「長呜」オブゞェクトずは、倚くのガベヌゞ コレクションを経おも生き残ったオブゞェクトのこずです。ほずんどの堎合、それらはプログラムの終了たで存圚したす。その結果、䜜成されたすべおのオブゞェクトが保存される共通ヒヌプは、いく぀かの郚分に分割されたした。最初の郚分には矎しい名前が付いおいたす -゚デン聖曞の「゚デンの園」。これは、オブゞェクトが䜜成された埌に移動する堎所であるため、玠晎らしい名前です。曞き蟌むずきに新しいオブゞェクトにメモリが割り圓おられるのはこの郚分です。new。倚くのオブゞェクトを䜜成でき、この領域のスペヌスがなくなるず、最初の「高速」ガベヌゞ コレクションが開始されたす。ガベヌゞ コレクタヌは非垞に賢く、ヒヌプ内にさらにあるもの (ガベヌゞ オブゞェクトか䜜業オブゞェクト) に応じお䜜業アルゎリズムを遞択するず蚀わなければなりたせん。ほずんどすべおのオブゞェクトがガベヌゞである堎合、コレクタヌは「ラむブ」オブゞェクトをマヌクしお別のメモリ領域に移動し、その埌珟圚の領域が完党にクリヌンアップされたす。ゎミが少なく、その倧郚分が生き物で占められおいる堎合は、ゎミにマヌクを付けお掃陀し、残った物を敎理したす。「コレクタヌは「生きおいる」オブゞェクトにマヌクを付け、別の蚘憶堎所に移動したす」ず蚀いたしたが、どれでしょうか? 少なくずも 1 回のガベヌゞ コレクションで生き残ったすべおのオブゞェクトが転送されるメモリ領域は、生存スペヌスず呌ばれたす。 次に、サバむバル スペヌスは䞖代に分割されたす。各オブゞェクトには、経隓したガベヌゞ コレクションの数に基づいお䞖代が割り圓おられたす。1 ぀ある堎合は「第 1 䞖代」に属し、5 ぀ある堎合は「第 5 䞖代」に属したす。Eden ず Survival Space は䞀緒に、 Young Generationず呌ばれる゚リアを圢成したす。Young Generation に加えお、ヒヌプにはもう 1 ぀のメモリ領域、Old Generation (「旧䞖代」) がありたす。これらは、倚くのガベヌゞ コレクションを経おも生き残った、非垞に長呜なオブゞェクトです。それらを他のものずは別に保管する方が有益です。そしお、旧䞖代゚リアがいっぱいの堎合のみ、぀たり プログラム内に存続期間の長いオブゞェクトが倚すぎおメモリが䞍足しおいる堎合でも、完党なガベヌゞ コレクションが実行されたす。1 ぀のメモリ領域だけでなく、通垞は Java マシンによっお䜜成されたすべおのオブゞェクトが凊理されたす。圓然のこずながら、より倚くの時間ずリ゜ヌスが必芁になりたす。そのため、寿呜の長いものは別々に保管するこずが決定されたした。他の゚リアでスペヌスがなくなるず、いわゆる「迅速なガベヌゞコレクション」が実行されたす。カバヌする゚リアは 1 ぀だけなので、より経枈的で高速です。最終的には、100歳以䞊の人のための゚リアさえもすでに詰たり、党面的な枅掃が行われるこずになる。したがっお、最も「重い」ツヌルは、必芁がなくなった堎合にのみアセンブラによっお䜿甚されたす。抂略的には、ヒヌプずクリヌニングの構造は次のようになりたす。 ガベヌゞ コレクタヌの詳现 - 5
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION