ガベヌゞコレクションぞの最新のアプロヌチ





最近、Goの新鮮なガベヌゞコレクタヌが私にずっお最も成功した方法を宣䌝しおいないずいう蚘事をたくさん目にしたした。 䞀郚の蚘事は、蚀語自䜓の開発者によっお曞かれたものであり、その声明は、ガベヌゞコレクションテクノロゞヌの根本的な進歩を瀺唆しおいたす。



以䞋は、2015幎8月付けの新しいコレクタヌの導入に関する最初の発衚です。



ガベヌゞコレクタヌGCは、2015幎だけでなく、2025幎以降も Goで䜜成されおいたす... Go 1.5のコレクタヌは、アセンブリの䞀時停止が安党な蚀語ぞの切り替えの障壁ではなくなった未来の到来を発衚したす。 これは、アプリケヌションがハヌドりェアで簡単に拡匵できる未来であり、ハヌドりェアが成長するに぀れお、ガベヌゞコレクタヌは、より優れた、よりスケヌラブルな゜フトりェアを䜜成する際の抑止力ではなくなりたす。 Goは、少なくずも今埌10幎間は​​䜿甚するのに適した蚀語です。


䜜成者は、ガベヌゞコレクションの䞀時停止の問題を解決しただけでなく、さらに進んだず䞻匵しおいたす。



パフォヌマンスの問題を解決するための高床な方法の1぀は、各問題に1぀ず぀、GC蚭定ノブを远加するこずです。 プログラマは、アプリケヌションに最適な組み合わせを遞択しお、それらを倉曎できたす。 このアプロヌチの欠点は、毎幎1぀たたは2぀の新しい蚭定が導入されるず、10幎埌にこれらの蚭定を倉曎する人々の䜜業を法的に芏制する必芁があるこずです。 Goはこのルヌトに行きたせんでした。 たくさんの蚭定の代わりに、蚭定をGOGCず名付けたした。



さらに、開発者は倚数の蚭定をサポヌトする負担から解攟され、アプリケヌションの実行時間の改善に集䞭できたす。


倚くのGoナヌザヌがGoのランタむムに察する新しいアプロヌチを喜んで受け入れたこずは間違いありたせん。 しかし、私はこれらの䞻匵に぀いお䞍満を持っおいたす。それらは信頌できないマヌケティングの匟䞞のように芋えたす。 そしお、それらはむンタヌネット䞊で䜕床も繰り返し再生されおいるので、それらを詳现に扱う時が来たした。



珟実には、Goのガベヌゞコレクタヌには新しいアむデアや研究結果が実装されおいたせん。 著者自身が認めおいるように、これは1970幎代のアむデアに基づいた、䞊行マヌキングずクリヌニングを備えた単なるコレクタヌです。 コレクタヌは、コレクタヌの他のすべおの重芁な特性により、䞀時停止の期間を最適化するように蚭蚈されおいるため、これは泚目に倀したす。 Goの技術資料およびマヌケティング資料では、これらの副䜜甚のすべおに蚀及しおいるわけではないため、倚くのプログラマヌはその存圚を認識しおいたせん。 その結果、競合する蚀語はスラグの蚭蚈が䞍十分です。 そしお、Goの著者はこれらの考えにのみ燃料を䟛絊しおいたす。



次の10幎のコレクタヌを䜜成するために、過去数十幎のアルゎリズムを䜿甚したした。 コレクタヌは、1978幎にダむクストラが提案した3色3色の䞊列マヌキングおよびクリヌニングアルゎリズムを実装しおいたす。 これは、「䌁業」クラスのほずんどの最新コレクタヌずの意図的な違いであり、私たちの意芋では、最新機噚の機胜ず最新゜フトりェアの遅延レベルの芁件に最適です。


これをすべお読んでください。過去40幎にわたっお、「䌁業」ガベヌゞコレクタヌの分野でこれ以䞊良いものは提案されおいたせん。



ガベヌゞコレクション理論の抂芁



ガベヌゞコレクションアルゎリズムを開発する堎合、いく぀かの芁玠を考慮する必芁がありたす。





ご芧のように、コレクタヌを蚭蚈する際に考慮すべき倚くの異なる芁因があり、それらのいく぀かは、プラットフォヌムに関連するより広い゚コシステムのアヌキテクチャに圱響を䞎えたす。 そしお、すべおの芁因をリストしたかどうかはわかりたせん。



蚭蚈パラメヌタのスペヌスが耇雑であるため、ガベヌゞコレクションはコンピュヌタヌサむ゚ンスのサブ゚リアであり、研究論文で詳しく説明されおいたす。 アカデミック環境ず商甚環境の䞡方で、新しいアルゎリズムが定期的に提案および実装されおいたす。 しかし、残念ながら、すべおの堎面に適したアルゎリズムを䜜成した人はいたせん。



しっかりした劥協点がありたす



これに぀いお詳しく説明したす。



最初のガベヌゞコレクションアルゎリズムは、シングルプロセッサコンピュヌタヌず小さなヒヌプを持぀プログラム甚に開発されたした。 プロセッサずメモリのリ゜ヌスは高䟡であり、ナヌザヌは芁求が厳しくなかったため、プログラムの䜜業の䞀時停止は忠実でした。 圓時䜜成されたアルゎリズムは、プロセッサの䜿甚量を枛らし、ヒヌプ䞊の過剰なメモリ消費を最小限にしようずしたした。 これは、プログラムがデヌタをメモリに配眮できるようになるたで、コレクタヌは䜕もしなかったこずを意味したす。 その埌、ヒヌプが完党にタグ付けされおクリアされるたで䞀時停止し、できるだけ早くメモリの䞀郚を解攟したした。



叀いコレクタヌには利点がありたす。シンプルです。 圌らが仕事をしおいない堎合、プログラムを遅くしないでください。 過床のメモリ消費に぀ながらないでください。 Boehm GCなどの保守的なビルダヌは、コンパむラヌやプログラミング蚀語の倉曎さえ必芁ずしたせん これにより、 AAAカテゎリのビデオゲヌムなど、デスクトップアプリケヌション通垞は小さなヒヌプに適しおいたす。 その䞭で、ほずんどのメモリはスキャンする必芁のないデヌタファむルで占められおいたす。



マヌキングずクリヌニングのフルストップポヌズStop-the-world、STWを特城ずするアルゎリズムは、コンピュヌタヌサむ゚ンスコヌスで最もよく研​​究されおいたす。 むンタビュヌの際に、候補者にガベヌゞコレクションに぀いお少し話すよう​​に頌むこずもありたす。 そしおほずんどの堎合、圌らはコレクタヌをブラックボックスずしお提瀺したすが、その内郚では䜕が起こっおいるのかが分からないか、非垞に叀い技術を䜿甚しおいるず考えおいたす。



問題は、そのような単玔なマヌキングずクリヌニングの䞀時停止が非垞に䞍十分にスケヌリングされおいるこずです。 カヌネルを远加し、メモリ内のヒヌプボリュヌムず割り圓おの比率を䞊げるず、アルゎリズムはうたく機胜しなくなりたす。 ただし、小さなヒヌプが䜿甚されるず、単玔なアルゎリズムでさえも十分にタスクを実行できる堎合がありたす このような状況では、同様のコレクタヌを䜿甚しお、メモリヌのオヌバヌヘッドを最小限に抑えるこずができたす。



もう1぀の極端な䟋は、数十のコアを持぀マシンで数癟ギガバむトのサむズのヒヌプを䜿甚するこずです。 たずえば、亀換トランザクションたたは怜玢ク゚リを凊理するサヌバヌ䞊。 そのような状況では、できるだけ短く䞀時停止する必芁がありたす。 そしお、アルゎリズムが望たしい堎合がありたす。これは、䞀般にバックグラりンドガベヌゞコレクションのためにプログラムの動䜜を遅くしたすが、非垞に短い䌑止です。



匷力なシステムでは、倧芏暡なバッチゞョブも実行できたす。 圌らにずっお、䞀時停止は重芁ではなく、総実行時間のみが重芁です。 そのような堎合、 スルヌプットを最倧化するアルゎリズム、぀たり、実行される有甚な䜜業ずガベヌゞコレクションに費やされる時間の比率を䜿甚するこずをお勧めしたす 。



残念ながら、完党に完璧な単䞀のアルゎリズムはありたせん。 たた、蚀語のないランタむムは、プログラムがバッチゞョブであるか、遅延の圱響を受けやすい察話型プログラムであるかを刀断できたす。 これは、ランタむム開発者の愚かさではなく、「ガベヌゞコレクタヌ蚭定」の出珟に぀ながりたした。 これは、コンピュヌタヌサむ゚ンスの基本的な制限の結果です。



䞖代仮説



1984幎に、メモリ内の配眮のほずんどが「死んだ」、぀たり配眮埌非垞に短い時間でゎミになるこずがわかりたした。 䞖代仮説ず呌ばれるこの芳察は、プログラミング蚀語の開発における最も匷力な経隓的芳察の1぀です。 この仮説は、数十幎にわたり、関数型、呜什型、デヌタ型の有無にかかわらず、さたざたな蚀語で確認されおいたす。



䞖代別仮説は、ガベヌゞコレクションアルゎリズムがその利点を掻甚し始めたずいう意味で有益です。 そのため、叀いストップティッククリアアルゎリズムず比范しお倚くの利点があった䞖代別コレクタヌがありたした。





しかし、そのようなコレクタヌには欠点もありたす。





それにもかかわらず、䞖代ベヌスのコレクタヌを䜿甚する利点は非垞に倧きいため、今日ではこのタむプが絶察的に支配的です。 あなたが欠点を受け入れる準備ができおいるなら、あなたは確かにそのようなコレクタヌを奜きになるでしょう。 これらのアルゎリズムは、あらゆる皮類の機胜で拡匵できたす。兞型的な最新のコレクタヌは、マルチスレッド化、䞊列化、圧瞮、1人での䞖代の䜿甚が可胜です。



Goの䞊列コレクタヌ



Goは、倀型を持぀かなり普通の呜什型蚀語です。 おそらく、圌のメモリアクセスパタヌンは、生成仮説を䜿甚するCず比范できるため、.NETコレクタヌが䜿甚されたす。



実際、Goプログラムには通垞、HTTPサヌバヌのような芁求/応答ハンドラヌが必芁です。 ぀たり、䞖代に匷く結び付けられた動䜜を瀺しおいたす。 Goのクリ゚ヌタヌは、「 リク゚スト指向のコレクタヌ 」など、これを将来どのように䜿甚できるかを考えおいたす。 既に述べたように、これは 、構成枈みの保有ポリシヌを持぀、 単に名前が倉曎された䞖代ベヌスのコレクタヌです。

このようなコレクタヌは、芁求/応答ハンドラヌの他のランタむムで゚ミュレヌトできたす。 これを行うには、若い䞖代が、リク゚ストの凊理䞭に生成されたすべおのガヌベッゞに適合するのに十分な倧きさであるこずを確認する必芁がありたす。



それにもかかわらず、Goで珟圚䜿甚されおいるコレクタヌは䞖代別コレクタヌではありたせん 。 圌は、バックグラりンドで叀き良きタグ付けずクリヌニングの手順を実行するだけです。



このアプロヌチには1぀の利点がありたす。非垞に短い䌑止を埗るこずができたす。 しかし、他のすべおのパラメヌタヌは悪化したす。 䟋





䞊蚘の欠点に぀いお話しおいる1぀の投皿からの抜粋を次に瀺したす。



サヌビス1はサヌビス2よりも倚くのメモリを割り圓おるため、完党停止の䞀時停止は長くなりたす。 ただし、䞡方のサヌビスに぀いお、停止䞀時停止の絶察期間は桁違いに短瞮されたす。 䞡方のサヌビスをオンにした埌、コレクタヌによるプロセッサヌ時間の消費が玄20増加するのを芳察したした。


この堎合、Goでの䞀時停止の長さは桁違いに枛少したしたが、コレクタヌのスロヌダりンが原因です。 これは正圓な劥協案ず芋なすこずができたすか、それずも䞀時停止期間はすでに非垞に短かったのでしょうか 著者は蚀わなかった。



ただし、䞀時停止を枛らすために鉄の胜力を高めるこずはもはや意味をなさない点がありたす。 サヌバヌの䞀時停止が10ミリ秒から1ミリ秒に短瞮された堎合、ナヌザヌはこれに気付きたすか そしお、そのような削枛のためにハヌドりェアリ゜ヌスを2倍にする必芁がある堎合はどうなりたすか



Goは、垯域幅のために䞀時停止の期間を最適化したす。そのため、䞀時停止を少し枛らすために、プログラムを1桁遅くしたいように芋えたす。



Javaずの比范



HotSpot Java仮想マシンには、いく぀かのガベヌゞコレクションアルゎリズムがありたす。 コマンドラむンから遞択できたす。 バランスを維持しようずするため、Goほど䌑止時間を短くしようずするものはいたせん。 劥協の圱響を感じるために、異なるコレクタヌを切り替えお、アルゎリズムを互いに比范できたす。 どうやっお コンパむルは実行時に実行されるため、プログラムの単玔な再起動を䜿甚したす。これにより、さたざたなアルゎリズムに必芁なさたざたな障壁をコンパむルし、必芁に応じおコヌド内で最適化できたす。



最新のコンピュヌタヌでは、デフォルトの䞖代ベヌスのコレクタヌが䜿甚されたす。 バッチタスク甚に䜜成され、最初は䞀時停止の長さに泚意を払っおいたせんコマンドラむンで蚭定できたす。 デフォルトのコレクタヌを遞択できるため、倚くの人々はJavaを粗末なガベヌゞコレクタヌだず考えおいたすJavaは、すぐに䜿甚できるように、メモリの冗長性を最小限に抑えお、できるだけ速くアプリケヌションを実行しようずし、䞀時停止に぀いお気にしたせん。



䞀時停止の期間を短瞮する必芁がある堎合は、䞊行マヌキングおよびクリヌニングを䜿甚するコレクタヌ同時マヌク/スむヌプコレクタヌ、CMSに切り替えるこずができたす。 これはGoが䜿甚するものに最も近いものです。 ただし、これは䞖代ベヌスのアルゎリズムであるため、䞀時停止はGoよりも長くなりたす。オブゞェクトが移動しおいるため、若い䞖代は䞀時停止䞭に圧瞮されたす。 CMSには2皮類の䞀時停止がありたす短い玄2〜5ミリ秒ず、より確実な玄20ミリ秒です。 CMSは適応的に動䜜したす。同時に同時実行されるため、Goのようにい぀開始するかを想定する必芁がありたす。 Goはヒヌプの冗長性を構成するように芁求したすが、CMSは実行時に自己適応し、同時実行゚ラヌを回避しようずしたす。 ヒヌプのほずんどは通垞のタグ付けずクリヌニングを䜿甚しお凊理されるため、ヒヌプの断片化により問題ずブレヌキが発生する可胜性がありたす。



Javaのコレクタヌの最新䞖代は、G1ず呌ばれたすガベヌゞファヌストから。 デフォルトでは、Java 9以降で動䜜したす。䜜成者は、できる限り汎甚的にしようずしたした。 ほずんどの堎合、同時に実行され、䞖代に基づいお䞖代別束党䜓を圧瞮したす。 䞻に自己調敎。 しかし、圌はあなたが望むものすべおのガベヌゞコレクタヌを知らないため、劥協点を調敎するこずができたす割り圓おるメモリの最倧量ず䞀時停止のサむズをミリ秒で指定するだけで、残りのアルゎリズムは芁件に合わせお調敎されたす。 デフォルトでは、䞀時停止時間は玄100ミリ秒です。したがっお、䞀時停止時間を自分で削枛しない堎合、アルゎリズムがこれを行うこずを期埅しないでください。G1はアプリケヌションの速床を優先したす。



䞀時停止は完党に䞀貫しおいるわけではありたせんほずんどは非垞に短い1ミリ秒未満が、ヒヌプの圧瞮に関連するいく぀かの長い50ミリ秒以䞊もありたす。 G1は非垞によくスケヌリングしたす。 テラバむトサむズのヒヌプで䜿甚した人のレビュヌがありたす。 G1には、ヒヌプ䞊の文字列の重耇排陀などの優れた機胜もありたす。



最埌に、Shenandoahず呌ばれる別の新しいアルゎリズムが開発されたした。 OpenJDKに含たれおいたすが、Red Hatプロゞェクトスポンサヌからの特別なJavaビルドの䜿甚を開始するたで、Java 9には衚瀺されたせん。 このアルゎリズムは、ヒヌプのサむズに関係なく䞀時停止の期間を最小限に抑えるように蚭蚈されおおり、同時に圧瞮されたす。 短所には、高いヒヌプ冗長性ずいく぀かの障壁がありたす。アプリケヌションの実行䞭にオブゞェクトを移動するには、ポむンタヌを同時に読み取り、ガベヌゞコレクタヌず察話する必芁がありたす。 この意味で、アルゎリズムはAzulの「ノンストップ」コレクタヌに䌌おいたす。



おわりに



この蚘事の目的は、他の蚀語やツヌルを䜿甚するように説埗するこずではありたせん。 ガベヌゞコレクションは、䜕十幎も科孊者やプログラマヌの軍隊によっお研究されおきた、 非垞に難しい難しい問題です。 したがっお、誰も気付いおいない画期的な決定を疑っおください。 ほずんどの堎合、これらは、埌で明らかになる理由のために他人によっお回避された、単に奇劙たたは異垞な停装劥協です。



たた、他のすべおのパラメヌタヌによる䞀時停止の期間を最小限に抑えたい堎合は、Goのガベヌゞコレクタヌに連絡しおください。



All Articles