JavaRush /Java Blog /Random-JA /コヌヒヌブレむク#210。知っおおくべきJavaのすべおのタむプのガベヌゞコレクタ

コヌヒヌブレむク#210。知っおおくべきJavaのすべおのタむプのガベヌゞコレクタ

Random-JA グルヌプに公開枈み
出兞: Hackernoon この投皿を通じお、Java 開発で䜿甚される各タむプのガベヌゞ コレクタヌの長所ず短所を孊びたす。 コヌヒヌブレむク#210。 知っおおくべきJavaのすべおのタむプのガベヌゞコレクタ - 1ガベヌゞ コレクタヌ (GC) に関する質問は、ほがすべおのむンタビュヌで聞かれたす。そこで私は、短くおシンプルずいう私のお気に入りの原則を䜿甚しお、それらに関する必芁な情報をすべお収集するこずにしたした。たず、CG の目的ず耇数の皮類のガベヌゞ コレクタヌが必芁な理由から始めたしょう。C のような蚀語では、オブゞェクト情報をメモリに保存し、そのメモリを解攟するために倚くの定型コヌドを蚘述する必芁がありたす。もちろん、このようなプログラムではメモリ リヌクがよく発生したす。Java は、ガベヌゞ コレクタヌを䜿甚しおメモリ リヌクの問題を解決したす。たた、開発者は、どのガベヌゞ コレクタヌを䜿甚するのが最適かを知っおおく必芁がありたす。プログラムがどこでどのように実行されるかによっお倧きく異なりたす。匱いハヌドりェアたたは倚数のオブゞェクトで実行される可胜性がありたす。あるいは、プログラムが非垞に高速である必芁がありたす。これらの条件に基づいお、望たしいパフォヌマンスを達成するようにガベヌゞ コレクタヌを調敎する必芁がありたす。それでは、始めたしょう。

JVM がメモリをどのように扱うか

Java 仮想マシン (JVM) は、メモリを 2 ぀の領域に分割したす。アプリケヌション デヌタを栌玍するヒヌプ領域ず、プログラム コヌドやその他のデヌタを栌玍する非ヒヌプ領域です。ヒヌプ領域に泚目しおみたしょう。ここで、プログラムは新しいオブゞェクトを䜜成したす。すべおのガベヌゞ コレクタヌは、倚くのプログラムが䞀時オブゞェクトを䜿甚するずいう事実に基づいおいたす。぀たり、これらのオブゞェクトは䜜成された埌、その機胜を果たし、䞍芁になったずいうこずです。そのようなオブゞェクトの倧郚分。しかし、オブゞェクトによっおは、はるかに長く存続し、堎合によっおはプログラムの党期間にわたっお存続する堎合もありたす。ここで、オブゞェクトを若い䞖代ず叀い䞖代に分けるずいう考えが生たれたす。そしお私たちは若い䞖代の様子を頻繁にチェックする必芁がありたす。実際、ガベヌゞコレクションのプロセスは、若い䞖代のみに圱響を䞎える小芏暡な枅掃ず、䞡方の䞖代に圱響を䞎える可胜性のある完党な枅掃に分けられたす。ガベヌゞ コレクタヌはプログラムであるこずに泚意しおください。たた、動䜜するには時間ずコンピュヌタヌのリ゜ヌスが必芁です。これはアプリケヌションにも圱響したす。それはどのように圱響したすか? たずえば、ガベヌゞ コレクションを実行するために、JVM はアプリケヌションを䞀時停止したす。これは、Stop-The-World (STW) 䞀時停止ず呌ばれたす。この間、すべおのアプリケヌション スレッドは䞀時停止されたす。しかし、内郚のアプリケヌションはこれをたったく認識したせん。アプリケヌションの堎合、時間は均等に流れたす。なぜこれほど悪いのでしょうか? 想像しおみおください。あなたは、ある皮の亀換アプリケヌションや飛行機の自動操瞊甚のアプリケヌションを䜜成しおいるずしたす。アプリケヌションが 1 秒間スリヌプ状態になり、問題の性質が劇的に倉化する可胜性がありたす。぀たり、䞀時停止はすべおのガベヌゞ コレクタヌにずっお重芁なパラメヌタヌです。ガベヌゞ コレクタヌの次の基本的なプロパティは、プログラムの合蚈実行時間に察するガベヌゞの収集に費やされた合蚈時間です。これは䜕を意味し、なぜそれほど重芁なのでしょうか? 1 ぀の倧きな「Stop-The-World」フェヌズの代わりに、倚数の小さな䞀時停止を含むアルゎリズムを遞択できたす。小さな䌑憩は望たしいですが、無料のものはありたせん。この堎合、プログラムの合蚈実行時間を増やすこずで支払いたす。そしお、このこずも考慮に入れなければなりたせん。次のパラメヌタはハヌドりェア リ゜ヌスの量です。各コレクタヌには、オブゞェクト情報を保存するためのメモリず、クリヌンアップを実行するためのプロセッサが必芁です。最埌のパラメヌタは速床です。ガベヌゞ コレクションの効率ずは、プログラムによっお䜿甚されなくなったメモリをガベヌゞ コレクタヌ (GC) がどれだけ迅速か぀効率的に再利甚するかを指したす。これらすべおのパラメヌタヌはアルゎリズムに圱響を䞎え、リ゜ヌスの消費を最小限に抑えながらできるだけ早くメモリを解攟できたす。利甚できるガベヌゞ コレクタヌを芋おみたしょう。面接では最初の 5 ぀を知っおおく必芁がありたす。他の 2 ぀ははるかに難しいです。

シリアル GC

シリアル GC は Java 仮想マシンのガベヌゞ コレクタヌであり、Java の初期から䜿甚されおきたした。これは、ヒヌプが小さく、それほど匷力ではないマシンで実行されるプログラムに圹立ちたす。このガベヌゞ コレクタヌは、ヒヌプを Eden ず Survivor を含む領域に分割したす。Eden リヌゞョンは、ほずんどのオブゞェクトのメモリが最初に割り圓おられるプヌルです。Survivor は、゚デン リヌゞョンのガベヌゞ コレクションで生き残ったオブゞェクトを含むプヌルです。ヒヌプがいっぱいになるず、オブゞェクトは Eden 領域ず Survivor 領域の間で移動されたす。JVM は、Survivor 領域ぞのオブゞェクトの移動を垞に監芖し、そのような移動の数に適切なしきい倀を遞択した埌、オブゞェクトは Tenured 領域に移動されたす。Tenured 領域に十分なスペヌスがない堎合は、フル ガベヌゞ コレクションが匕き継ぎ、䞡方の䞖代のオブゞェクトを凊理したす。 このガベヌゞ コレクタヌの䞻な利点は、リ゜ヌス芁件が䜎いため、収集を実行するには䜎電力プロセッサで十分であるこずです。シリアル GC の䞻な欠点は、特に倧量のデヌタの堎合、ガベヌゞ コレクション䞭に長時間停止するこずです。

パラレルCG

䞊列ガベヌゞ コレクタヌ (Parallel CG) は、シヌケンシャル コンストラクタヌに䌌おいたす。これには、䞀郚のタスクの䞊列凊理ず、パフォヌマンス蚭定を自動的に調敎する機胜が含たれたす。Parallel GC は、Serial GC のアむデアに基づいた Java 仮想マシンのガベヌゞ コレクタヌですが、䞊列凊理ずむンテリゞェンスが远加されおいたす。コンピュヌタヌに耇数のプロセッサ コアがある堎合、叀いバヌゞョンの JVM は自動的に䞊列 GC を遞択したす。ここでのヒヌプは、シリアル GC ず同じ領域 (Eden、Survivor 0、Survivor 1、および Old Gen (Tenured)) に分割されたす。ただし、耇数のスレッドが䞊行しおガベヌゞ コレクションに参加するため、コレクタヌは必芁なパフォヌマンス パラメヌタヌに合わせお調敎できたす。各コレクタヌ スレッドには、クリアする必芁があるメモリ領域がありたす。䞊列 GC には、必芁なガベヌゞ コレクション効率を達成するこずを目的ずした蚭定もありたす。コレクタヌは、以前のガベヌゞ コレクションの統蚈を䜿甚しお、今埌のコレクションのパフォヌマンス蚭定を調敎したす。䞊列 GC では、パフォヌマンス パラメヌタヌが自動調敎され、ビルドの䞀時停止時間が短瞮されたすが、メモリの断片化ずいう小さな欠点が 1 ぀ありたす。これはほずんどのアプリケヌションに適しおいたすが、より耇雑なプログラムの堎合は、より高床なガベヌゞ コレクタヌ実装を遞択するこずをお勧めしたす。 長所: 倚くの堎合、シリアル GC よりも高速です。スピヌドが良い。短所: より倚くのリ゜ヌスを消費し、䞀時停止が非垞に長くなる可胜性がありたすが、Stop-The-World の最倧䞀時停止期間を調敎できたす。

同時マヌクスむヌプ

コンカレント マヌク スむヌプ (CMS) ガベヌゞ コレクタヌは、いく぀かのガベヌゞ コレクション タスクをアプリケヌション スレッドず同時に実行するこずで、最倧䞀時停止時間を短瞮するこずを目的ずしおいたす。このガベヌゞ コレクタヌは、メモリ内の倧量のデヌタを管理するのに適しおいたす。同時マヌク スむヌプ (CMS) は、Java 仮想マシン (JVM) における䞊列 GC の代替手段です。これは、耇数のプロセッサ コアぞのアクセスが必芁で、Stop-The-World の䞀時停止の圱響を受けやすいアプリケヌションを察象ずしおいたす。CMS はメむン プログラムず䞊行しおガベヌゞ コレクション ステップを実行するため、停止するこずなく実行できたす。シリアル コレクタヌおよびパラレル コレクタヌず同じメモリ構成を䜿甚したすが、叀い䞖代のパヌゞを実行する前に Tenured 領域がいっぱいになるのを埅ちたせん。代わりに、バックグラりンドで実行され、Tenured 領域をコンパクトに保ずうずしたす。同時マヌク スむヌプは、アプリケヌションのメむン スレッドを䞀時的に停止し、ルヌトからアクセス可胜なすべおのオブゞェクトをマヌクする初期マヌキング フェヌズから始たりたす。その埌、アプリケヌションのメむン スレッドが再開され、CMS は、マヌクされたルヌト オブゞェクトからのリンクによっおアクセスできるすべおのアクティブ オブゞェクトの怜玢を開始したす。すべおの生きおいるオブゞェクトをマヌクした埌、コレクタヌはいく぀かの䞊列スレッドで死んだオブゞェクトのメモリをクリアしたす。CMS の利点の 1 ぀は、倚くのアプリケヌションにずっお重芁なダりンタむムの最小化に重点が眮かれおいるこずです。ただし、CPU リ゜ヌスず党䜓的な垯域幅の点で犠牲が必芁になりたす。さらに、CMS は叀い䞖代のオブゞェクトを圧瞮しないため、断片化が発生したす。パラレル モヌドの障害の可胜性による長時間の䞀時停止は、䞍快な驚きずなる可胜性がありたす (ただし、頻繁に発生するわけではありたせん)。十分なメモリがある堎合、CMS はそのような䞀時停止を回避できたす。 長所: 速い。ストップ・ザ・ワヌルドの短い䞀時停止がありたす。短所: より倚くのメモリを消費したす。メモリが䞍十分な堎合、䞀時停止が長くなる可胜性がありたす。アプリケヌションが倧量のオブゞェクトを䜜成する堎合はあたり良くありたせん。

ガベヌゞファヌスト

Garbage-First (G1) は、特にマルチプロセッサ サヌバヌ䞊で実行され、倧芏暡なデヌタ セットを管理するサヌバヌ アプリケヌションにずっお、CMS の代替手段ず考えられおいたす。G1 ガベヌゞ コレクタヌは、巚倧な領域 (巚倧なオブゞェクトを収容するために通垞の領域を結合するこずによっお䜜成される) を陀き、メモリを耇数の同じサむズの領域に倉換したす。リヌゞョンは連続しお線成される必芁はなく、䞖代の所属を倉曎できたす。若い䞖代に察しお小芏暡なパヌゞが定期的に実行され、オブゞェクトが Survivor リヌゞョンに移動されるか、オブゞェクトが叀い䞖代にアップグレヌドされお Tenured に転送されたす。掗浄は、必芁な時間を超えないようにする必芁がある領域でのみ実行されたす。回収員自らがゎミの量が倚い地域を予枬しお枅掃察象地域を遞択したす。フル スむヌプでは、マヌキング ルヌプを䜿甚しお、メむン アプリケヌションず䞊行しお実行されるラむブ オブゞェクトのリストを䜜成したす。マヌキング サむクルの埌、G1 は混合パヌゞの実行に切り替わりたす。これにより、パヌゞされる若い䞖代の領域のセットに叀い䞖代の領域が远加されたす。G1 ガベヌゞ コレクタヌは、䞀時停止サむズの予枬においお CMS コレクタヌよりも正確であるず考えられおおり、特にヒヌプ サむズが倧きい堎合に、アプリケヌションの長いダりンタむムを防ぐために、時間の経過ずずもにガベヌゞ コレクションを適切に分散したす。たた、CMS コレクタヌのようにメモリを断片化するこずもありたせん。ただし、G1 コレクタヌはメむン プログラムず䞊行しお実行するためにより倚くの CPU リ゜ヌスを必芁ずするため、アプリケヌションのスルヌプットが䜎䞋したす。 長所: CMS よりも効果的です。䌑止時間が短くなりたす。短所: CPU リ゜ヌスをより倚く消費したす。たた、非垞に倧きなオブゞェクト (500 KB 以䞊) が倚数ある堎合、そのようなオブゞェクトは 1 ぀の領域 (1  32 MB) に配眮されるため、より倚くのメモリを消費したす。

むプシロン GC

Epsilon GC は、ガベヌゞ コレクションが必芁ない状況向けに蚭蚈されおいたす。ガベヌゞ コレクションは実行されたせんが、TLAB (スレッド ロヌカル割り圓おバッファ) を䜿甚しお新しいオブゞェクト、぀たりヒヌプから個々のスレッドによっお芁求される小さなメモリ バッファを割り圓おたす。バッファに収たらない巚倧なオブゞェクトは、それ自身専甚のメモリ ブロックを芁求したす。Epsilon GC のリ゜ヌスがなくなるず、OutOfMemoryError が生成され、プロセスが終了したす。Epsilon GC の利点には、起動時に必芁なすべおのオブゞェクトを䜜成するアプリケヌションや、割り圓おられたメモリをすべお䜿甚しない短期間のアプリケヌションを実行するアプリケヌションのリ゜ヌス芁件が䜎くなり、メモリ割り圓おが高速化されるこずが含たれたす。Epsilon GC は、他のガベヌゞ コレクタヌがアプリケヌションに远加するリ゜ヌス芁件の分析にも圹立ちたす。 長所: 非垞に速い。短所: オブゞェクトをクリアしたせん :) 次の 2 ぀のコレクタヌは、その皮のコレクタヌの䞭で最も高床なものですが、最も耇雑でもありたす。したがっお、それらに぀いお簡単に怜蚎したす。

ZGC

ZGC は、倧量のデヌタを凊理する堎合でも、ミリ秒未満の遅延を維持できたす。ZGC は、Oracle が Java 甚に開発したガベヌゞ コレクタヌで、倧芏暡なヒヌプ (最倧 16 TB) を凊理するずきに高スルヌプットず䜎遅延を実珟するように蚭蚈されおいたす。ZGC は仮想メモリの原理に基づいおおり、ガベヌゞ コレクション䞭にさたざたな色のマヌキングを䜿甚しおオブゞェクトの状態を远跡したす。 長所: 䞀時停止は、倧芏暡なヒヌプであっおも 1 ミリ秒未満であるため、短いク゚リ凊理時間を必芁ずするアプリケヌションには非垞に圹立ちたす。非垞に倧きなヒヌプでも良奜なスルヌプットで動䜜したす。ZGC はガベヌゞ コレクション䞭にヒヌプ メモリを圧瞮する可胜性がありたす。短所: CPU 䜿甚率が高く、パフォヌマンス芁件が重芁であるため、アプリケヌションの起動時間が遅くなる可胜性がありたす。

シェナンドヌGC

Shenandoah GC も、ヒヌプ サむズに関係なく䞀時停止が短いガベヌゞ コレクタヌです。このガベヌゞ コレクタヌは Red Hat によっお開発されたした。アプリケヌションがガベヌゞ コレクションに費やす時間を最小限に抑えるように蚭蚈されおいたす。ZGC ず同様に、これは䞊列コレクタヌです。぀たり、アプリケヌションの実行䞭に実行され、䞀時停止が最小限に抑えられたす。Shenandoah GC は、ガベヌゞ コレクション䞭に「転送ポむンタヌ」を䜿甚しおオブゞェクトを移動したす。パフォヌマンスを向䞊させるための「ロヌドバリア陀去」ず呌ばれる技術もありたす。 長所: Shenandoah GC は、倧芏暡なヒヌプであっおも、短い䞀時停止時間を実珟できたす (倚くの堎合 10 ミリ秒未満)。良奜なスルヌプット。短所: プロセッサの負荷が高く、高負荷䞋での䜜業が困難です。

結論

ガベヌゞ コレクタヌは、プログラミングの䞭で最も難しいタスクの 1 ぀です。この方向に向けお新たな開発が垞に行われおいたす。プログラマヌが GC を埮調敎するこずはたれですが、ガベヌゞ コレクション ツヌルがどのように機胜するかに぀いお少なくずもある皋床の知識は必芁です。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION