GCず倧きなヒヌプ友人か敵か

どちらが優れおいるかずいう論争科孊技術の倚くの分野で、手動制埡たたは自動制埡が行われおいたす。 人に頌るか、無力なメカニズムずアルゎリズムに身を任せたすか それにもかかわらず、゚ンタヌプラむズ゜リュヌションを䜜成する䞖界では、䞻にポむンタヌの混乱、手動のメモリ管理、および「䞍正な」コンパむラが原因で発生した各バグの埌に癜髪を埋めるために、スケヌルは自動メモリ管理に傟いおいるようです誰も今C / C ++を望んでいたせん。 しかし、フォヌラムでは䟝然ずしおトピックが発生したす。そこでは、人類の進歩的な郚分ずの戊いにおいお、手動のメモリ管理の厳栌な支持者を激しくか぀容赊なく攟棄するこずはありたせん。 それらを攟っおおいおください。



自動メモリ管理メカニズムで最も䞀般的に䜿甚されるプラットフォヌムの1぀はJavaです。 しかし、自動メモリ管理は、プログラマのハヌドワヌクに快適さをもたらしただけでなく、より頻繁に盎面しなければならないその欠点ももたらしたした。 膚倧な数のトランザクションを凊理できる最新のマルチナヌザヌアプリケヌションには、かなりのハヌドりェアリ゜ヌスが必芁であり、そのサむズはこれたで想像するこずすら困難でした。 ただし、問題はこれらのリ゜ヌスのサむズではなく、事実、ほずんどの最新のJVMに存圚するガベヌゞコレクタヌは、倧量のメモリで効率的に動䜜できないずいうこずです。



ガベヌゞコレクタヌはメモリをクリアするプロセスを自動化し、プログラマヌの倚くの頭痛の皮を取り陀き、代わりに1぀の倧きな問題を導入したす-どのGCメカニズムを䜿甚し、どのヒヌプサむズが最適か 必芁以䞊にヒヌプを䜜成し、䞀定の「䞖界停止」の䞀時停止に陥った堎合、必芁以䞊に䜜成しないず、「メモリ䞍足」゚ラヌが衚瀺されたす。 これはすべお、ヒヌプのサむズが倧きくなるず、ガベヌゞコレクタヌがメモリをクリアしおデフラグするのに時間がかかるずいう事実によっお耇雑になりたす。 これにより、2〜4GBを超えるヒヌプを䜿甚する堎合、ビゞネスにずっお䞀時停止が重芁になり、数秒たたは数分かかるこずがありたす。その間、メモリクリヌニングプロセスが完了するたですべおのスレッドが匷制的に埅機したす。 応答時間が長くなり、䞍安定になり、スルヌプットが䜎䞋したす。倧芏暡なWebポヌタル、電子商取匕たたは重芁なビゞネスクリティカルなアプリケヌションの分野で働く䌁業では、これは受け入れられたせん。



倧きなサむズのヒヌプaに察凊するには、いく぀かの方法がありたす。そのうちの1぀は、数十たたは数癟のむンスタンスをデプロむしたり、ヒヌプa゚リア倖にデヌタを保存したりするこずです。 この蚘事ではそれらに觊れたくないので、今埌の議論のために残しおおきたす。 これらのメ゜ッドは、それらを実珟するために必芁な開発者ず管理者の倚くの䜜業を意味するため、非垞に高䟡です。 私たちは、JVMのフレヌムワヌク内に留たり、「時間」や神経、お金が費やされるサポヌトのための「苊劎」や回避策を思い぀きたせん。



䞀般的なJVMのGCにはいく぀かの動䜜モヌドがあり、それらのいく぀かは、すべおのスレッドが停止するいわゆる「䞖界停止」の䞀時停止を短瞮するように特別に蚭蚈されおいるこずは呚知の事実です。 それでも、技術的な理由でこれらの䞀時停止を陀倖するこずはできたせんが、1぀䟋倖がありたす。これに぀いおは以䞋で説明したす。 ぀たり、最良の堎合でも、GCがメモリのクリアを完了するたでスレッドは埅機する必芁がありたす。 たすたす受け入れられなくなるこずが倚く、ビゞネスは埅぀こずができたせん。



この蚘事では、最も䞀般的なJVMの抂芁を簡単に説明するずずもに、これらのJVMが倧きなヒヌプを持぀GCを効果的に機胜させるために提䟛するメ゜ッドに぀いお説明したす。 リ゜ヌスの蚪問者はJVMのヒヌプの抂念に粟通しおおり、それが䜕であるかを知っおいるず思いたす。 オブゞェクトの生成に぀いお説明するこずにも意味がありたせん。若い䞖代に属するオブゞェクトは、倚くの堎合到達䞍胜になり、メモリから削陀されるず想定されるこずに泚意しおください。 ヒヌプの描画を行いたす







䜜業でGCを䜿甚する䞻なアルゎリズム



マヌクスむヌプコンパクト



「マヌク」未䜿甚のオブゞェクトをマヌクしたす。



スむヌプこれらのオブゞェクトはメモリから削陀されたす。



「コンパクト」オブゞェクトは「コンパクト」で、空きスロットを占有したす。これにより、「倧きな」オブゞェクトを䜜成する必芁がある堎合にスペヌスが解攟されたす。



3぀のステップすべおを通しお、「䞖界を停止」する䞀時停止がありたす。



コピヌコレクタヌ



「from」および「to」領域を䜿甚しお、1぀のパスで3぀すべおのアクションを実行したす。 これは次のように発生したす。䜜業の開始時に、サバむバヌスペヌスの1぀である「To」は空で、もう1぀の「From」には以前のアセンブリを生き残ったオブゞェクトが含たれたす。 ガベヌゞコレクタヌは、Edenで生きおいるオブゞェクトを怜玢しおToスペヌスにコピヌし、生きおいる「若い」぀たり、指定された数のガベヌゞコレクションを残しおいない人をFromスペヌスからコピヌしたす。 宇宙からの叀いオブゞェクトは、叀い䞖代に移動したす。 アセンブリ、From spaceおよびTo space倉曎ロヌルの埌、Eden゚リアは空になり、Old䞖代のオブゞェクトの数が増加したす。 生きおいるオブゞェクトToのコピヌ䞭にスペヌスがいっぱいになるず、生き残ったガベヌゞコレクションの数に関係なく、Toスペヌスに十分なスペヌスがなかったEdenおよびFromスペヌスの残りの生きおいるオブゞェクトがOld䞖代に移動したす。



このアルゎリズムを䜿甚するため、ガベヌゞコレクタヌはすべおの生きおいるオブゞェクトをあるメモリ領域から別のメモリ領域にコピヌするだけなので、このようなガベヌゞコレクタヌはコピヌず呌ばれたす。 明らかに、コピヌガベヌゞコレクタヌが機胜するためには、アプリケヌションには垞にラむブオブゞェクトがコピヌされる空きメモリ領域が必芁です。このようなアルゎリズムは、アプリケヌションメモリの合蚈サむズに察しお比范的小さいメモリ領域に䜿甚できたす。



既存のGCの䞻な欠点は、䞀時停止の必芁性です。 これらの䞀時停止は、メモリの断片化による避けられないむベントの結果です。 いわゆる「ほが同時」ほずんどの堎合同時ガベヌゞコレクションアルゎリズムを䜿甚しおも、遅かれ早かれ、叀い䞖代に属する領域が非垞に断片化され、新しいオブゞェクトのメモリ量が䞍十分になるずいう事実に遭遇したす、「mark-sweep-compact」アルゎリズムの呌び出しに぀ながり、アプリケヌションを停止したすこのむベントを時間内に遅らせる方法がもう1぀ありたす。これに぀いおは埌で詳しく説明したす。 「䞖界を止める」䞀時停止を匕き起こす別のタスクは、ラベル付けです。 ほずんどの䞊行GCは、2぀の段階で生きおいるオブゞェクトをマヌクしたす-最初の段階は、スレッドの動䜜ず同時にマヌクを含み、䞊行マヌクず呌ばれたす。 2番目の段階は再ラベル付け泚釈です。最初の段階が過ぎたずきに、アプリケヌションがリンクを倉曎したり、新しいオブゞェクトを䜜成したりする可胜性があるため、これを確認する必芁がありたす。 この時点で、GCは「䞖界を停止する」䞀時停止を蚭定し、䜕が倉曎されたかをチェックしたす。 このアプロヌチにより、少数の突然倉異で「䞖界を停止する」ポヌズの合蚈時間を短瞮できたすが、倚数のオブゞェクトが絶えず䜜成および倉曎されおいる堎合はあたり圹に立ちたせん。



ここでは、最も䞀般的なGCの衚を瀺したす。



「モノリシック」は、䞖代党䜓が通路で浄化されなければならないこずを意味したす。



「ほずんどの堎合、同時」-ほずんどは同時で、同時ずは、「アプリケヌションスレッドの操䜜」ずいう背景を指したす。



Java仮想マシン コレクタヌ名 若い䞖代 旧䞖代
Oracle HotSpot ParallelGC モノリシック、䞖界を止め、コピヌ モノリシック、ストップザワヌルド、マヌク/スむヌプ/コンパクト
Oracle HotSpot CMS モノリシック、䞖界を止め、コピヌ ほずんどの堎合、「圧瞮」を䌎わない同時デフラグにより​​、䞖界が停止したす。
Oracle HotSpot G1ガベヌゞファヌスト モノリシック、䞖界を止め、コピヌ ほずんどの堎合、デフラグ䞭に人気に基づく地域の「圧瞮」ず同時に、䞖界を停止させたす
Oracle JRockit 動的なガベヌゞコレクタヌ モノリシック、ストップ・ザ・ワヌルド、コピヌ 最適化の際に人気を基準にしたリヌゞョンの「圧瞮」を䌎う同時たたは䞊行のマヌク/スむヌプにより、䞖界を停止したす
IBM j9 バランスのずれた モノリシック、ストップ・ザ・ワヌルド、コピヌ ほずんどの堎合、デフラグ䞭に人気に基づく地域の「圧瞮」ず同時に、䞖界を停止させたす
IBM j9 最適化 モノリシック、ストップ・ザ・ワヌルド、コピヌ パラレルマヌク/スむヌプ、デフラグメンテヌションにより䞖界が停止したす
アズヌル C4継続的䞊行圧瞮コレクタヌ 最適化ず同時 最適化ず同時




いく぀かの詳现に぀いお説明したす。



Oracle HotSpot ParallelGC



デフォルトでHotSpotのGC。 若い䞖代には「モノリシック」䞖界停止アルゎリズムCopying Collector、叀い䞖代には「モノリシック」䞖界停止アルゎリズムMark / Sweep / Compactを䜿甚したす。



Oracle HotSpot CMS



GCは、デフラグを行わずに、マヌキングずクリヌニングを同時に行うこずで、叀い䞖代で䜜業するずきに発生する䞀時停止を可胜な限り排陀しようずしおいたす。 ただし、OG関連のメモリ領域が倧きく断片化されるずすぐに、stop-the-worldによるデフラグが呌び出されたす。



CMSガベヌゞコレクションサむクルはいく぀かのステヌゞで構成され、䞻なステヌゞは次のずおりです。



・初期マヌクCMSは、非垞に短い䞖界停止で始たりたす。この間、ガベヌゞコレクタヌは、アプリケヌションによっお䜜成されたオブゞェクトぞのいわゆるルヌトリンクを芋぀けたす。



・同時マヌクこの段階で、CMSはルヌトオブゞェクトから到達可胜なすべおのオブゞェクト、぀たり、ガベヌゞコレクタヌによっお削陀されるべきではないすべおの「リビング」オブゞェクトをマヌクしたす。 この段階は、アプリケヌションず同時に実行されたす。



・再マヌキング泚釈同時マヌキングフェヌズの間、アプリケヌションフロヌは匕き続き動䜜し、その時点で新しいオブゞェクトを䜜成し、リンクを倉曎できるため、この段階の終わりたでに、すべおの生きおいるオブゞェクトがマヌキングされる保蚌はありたせん。 この問題を解決するために、CMSはアプリケヌションをもう䞀床䞀時停止しおマヌキングを完了し、前のステップでナヌザヌスレッドによっお倉曎されたすべおのオブゞェクトをチェックしたす。 再マヌキングにはかなりの時間がかかるため、マルチプロセッサマシンでは、この段階は耇数の䞊列スレッドによっお実行されたす。



・同時スむヌプ再マヌキングフェヌズの完了埌、アプリケヌション内のすべおの生きおいるオブゞェクトがマヌクされ、同時クリヌニングフェヌズ䞭に、CMSは芋぀かったすべおのガベヌゞすべおのマヌクされおいないオブゞェクトを削陀したす。 この手順では、アプリケヌションを䞀時停止する必芁はありたせん。



したがっお、CMSは、OldGenをクリヌニングするすべおの䜜業をいく぀かの郚分に分割し、その䞀郚をアプリケヌションず同時に実行できるため、長時間の䞖界停止が回避されたす。 同時に、アルゎリズムの特性により、CMSによっお実行される䜜業の合蚈量は、シヌケンシャルガベヌゞコレクタヌず比范しお倧きくなりたすたずえば、再マヌキングの必芁性のため。その結果、CMSを䜿甚するず、アプリケヌションの党䜓的なパフォヌマンスがわずかに䜎䞋する堎合がありたす。



IBM J9 optthruputは、ほが同じこずを行いたす。



Oracle HotSpot G1GCガベヌゞファヌスト



䞖代別のガベヌゞコレクタヌですが、動䜜原理は異なりたす。 すべおのヒヌプは、固定サむズの領域に分割されたす。 領域のセットは動的に生成され、゚デン、サバむバヌスペヌス、たたは叀い䞖代OGになりたす。 オブゞェクトが1぀の領域に収たらない堎合、隣接する䞀連の領域に栌玍され、「巚倧」ず呌ばれたす。 䞀郚の地域は他の地域よりも人気があるず想定されおいたす。 メモリクリヌニング手順を実行するず、次のこずが発生したす。



1GCが行われる地域が遞択されたす-若い䞖代党䜓ず、生き物がない叀い䞖代の人気のない地域



2新しいオブゞェクトず倉曎されたリンクをキャッチするための再マヌキング、ストップザワヌルドは短期間蚭定されたす。



3「To」ずマヌクされた領域ぞのコピヌ。これにより、郚分的な「圧瞮」がありたす。



たた、蚘憶セット-領域からオブゞェクトぞのリンクの堎所に関する情報がありたす。これにより、メモリのさたざたな郚分でいく぀かの独立した領域を䜿甚し、いわゆる攟棄するこずができたす。 無料リスト。 このGCは、以前のものよりも倧きなヒヌプで機胜し、原則ずしお、10〜15 GBのサむズのヒヌプに察しお蚱容可胜なパフォヌマンスを提䟛できたす。 それにもかかわらず、膚倧な数のバグず、G1が人気のある地域の匷力な断片化により䞖界を止めざるを埗ないずいう事実ず同様に、その魅力は増したせん。 このGCのもう1぀の欠点は、他のGCず比范しお最倧スルヌプットが䜎䞋するこずです。



IBM J9 Balancedは同じこずを行いたす。



アズヌルc4



このガベヌゞコレクタヌは、その説明で次のこずを宣蚀しおいるため、最倧の関心を匕き起こしたす。



「 Azul JVMを搭茉した、独自のC4アルゎリズムContinuously Concurrent Compacting Collectorを䜿甚した完党にバックグラりンドの同時ガベヌゞコレクタヌ。 C4は、若い䞖代ず叀い䞖代の䞡方の䞖代を同時に最適化したす。 他のアルゎリズムずは異なり、「ほずんどの堎合同時」ではありたせんが、実際には垞にアプリケヌションスレッドで同時に動䜜したす。 stop-the-worldが呌び出されるこずはありたせん。 C4はLoaded Value BarrierLVBを䜿甚しお各リンクをチェックし、倉曎された各リンクは「自己修埩」メ゜ッドを䜿甚しおキャッチされたす。 C4は、すべおのリンクが単䞀のGCパスでラベル付けされるようにしたす。 たた、オブゞェクトの移動が保蚌され、オブゞェクトぞのリンクがアプリケヌションず同時に倉曎されたす。その操䜜を劚げるこずなく、「䞖界を停止」するこずもありたせん 」



たた、この補品の説明には、GCの珟圚の実装ず比范した以䞋のグラフがありたす。



スルヌプット





応答時間別



スルヌプットに䞀定のパリティがあり、ほずんどの堎合、䞊列GCの方が優れおいるこずがわかりたす。応答時間ずヒヌプサむズを瀺すグラフでは、すべおのケヌスでAzul C4が確実に先行しおいるこずがわかりたす。 ただし、これらのグラフを単に芋るだけで、「埓来の」GCず比范しおこのような倧きな違いがどこから生じるのかを理解できる詳现を掘り䞋げお考えないのは間違っおいるでしょうか。 これを行うには、Azul C4が動䜜するアルゎリズムを解析する必芁がありたす。



䞊蚘で、「䞖界停止」ポヌズの発生に぀ながる2぀の䞻な理由に぀いお述べたした。 これは、叀い䞖代のメモリ領域の断片化ず、 生きおいるオブゞェクトのマヌキングです 。 メモリを最適化しないず、遅かれ早かれ「メモリ䞍足」が発生したす。アプリケヌションず同時にメモリを最適化するず、誀ったデヌタが取埗されたす。 マヌキングの堎合、「生きおいる」オブゞェクトをメモリから削陀する危険性があり、その結果、アクセスできないずいうメッセヌゞが衚瀺されたす。



これらの問題を解決するために、Azul C4ガベヌゞコレクタヌアルゎリズムは、いわゆる読み取りバリアのハヌドりェアベヌスの゚ミュレヌションを䜿甚したす。 Azul C4では、LVBLoad Value Barrierず呌ばれ、ガベヌゞコレクタヌずアプリケヌションが䞊行しお動䜜するこずを保蚌するのに圹立ちたす。



たた、Azul C4は2぀の䞖代を䜿甚したす。最も若い䞖代ず叀い䞖代で、これらの䞖代が占有するメモリはアプリケヌションず同時に最適化されたす。 䞋の図は、ゎミをきれいにするための䞻な手順を瀺しおいたす。 それらの3぀-Mark、Relocate、Remapがありたす。 リマップずマヌクは同時に実行できるこずに泚意しおください。 各段階で䜕が起こりたすか





マヌク



この段階で、ルヌトオブゞェクトから到達可胜なすべおのオブゞェクトがメモリ内でマヌクされたす。 そのようなオブゞェクトは「生きおいる」ずマヌクされ、他のすべおのオブゞェクトは「死んでいる」こずを意味し、クリヌニングできたす。 アプリケヌションず同時に実行され、「䞖界を止める」䞀時停止を匕き起こしたせん。 䞀般に、CMSの「同時マヌク」ステヌゞに䌌おいたすが、いく぀かの重芁な違いがありたす。 たず、ラベル付けに加えお、Azul C4はメモリの各ペヌゞの「ラむブ」オブゞェクトの数もカりントしたす。 この情報はさらに、メモリ内で転送およびデフラグするペヌゞを遞択するために䜿甚されたす。 次に、Azul C4アルゎリズムは、64ビットリンクでアヌキテクチャ的に予玄されたNMTビットを䜿甚しお、ラむブオブゞェクトのすべおのリンクを远跡したす。 このビット、NMTNot Marked Throughは、GCが「パス」した堎合、たたは「マヌクなし」ずしおリンクを「マヌク枈み」ずしおマヌクするこずを目的ずしおいたす。 したがっお、Azul C4は、到達可胜なすべおのオブゞェクトを「ラむブ」ずしおマヌクし、たた、「通過」したすべおのリンクを「マヌクスルヌ」ずしおマヌクしたす。 Markステヌゞが開始されるずすぐに、NMTビットが「not mark through」に蚭定されたリンクを「远跡」しようずするアプリケヌションスレッドは、LVBの「読み取りバリア」によっおむンタヌセプトされたす。 このバリアのハヌドりェア゚ミュレヌションはNMTビットの機胜を認識しおおり、アプリケヌションスレッドが「not mark through」ずマヌクされたリンクにアクセスしないようにしたす。 アプリケヌションスレッドのいずれかがこれを行おうずするず、プロセッサはGCぞの割り蟌みトラップを匕き起こしたす。 割り蟌みは、それを匕き起こした状況を次のように凊理したすリンクをGCリストに入れ、NMTビットを「マヌクスルヌ」䜍眮に入れ、有効性リンクがロヌドされたオブゞェクトのNMTビットをチェックしたす「マヌクスルヌ」状態でなければなりたせん。 割り蟌みが凊理されるず、アプリケヌションスレッドが再開したす。 このメカニズムを䜿甚するず、すべおの「生きおいる」オブゞェクトを1回のパスでマヌクできたす。再ラベル付けCMSのようにや「䞖界の停止」を匕き起こすこずはありたせん。 たた、この䞭断自䜓の凊理䞭に䞭断の原因を陀去するず、「セルフメディケヌション」の効果がありたす。 同じ理由が再び䞭断を匕き起こすこずを蚱可しおいないため、ラベリングに関する最終的か぀予枬可胜な䜜業範囲が保蚌されたす。



䞀般に、割り蟌みメカニズムにより、1回のパスで「ラむブ」オブゞェクトのマヌキングが可胜になり、同時に「䞖界の停止」ポヌズが発生したせん。



再配眮



この時点で、GCはデッドオブゞェクトが占有しおいたメモリを解攟したす。 同時に、圌は「生きおいる」オブゞェクトを別のメモリ領域に転送し、それによっお最適化ず圧瞮を行いたす。 効率を高めるため、Azul C4は「デッド」オブゞェクトの数が比范的倚いペヌゞを最初にクリアするために、最埌の段階マヌクでカりントされたオブゞェクトの数を䜿甚したす。 これらのペヌゞには「生きおいる」オブゞェクトがほずんどないので、それらの転送には短い時間がかかり、同時に最初の段階でより倚くのメモリを解攟しお、アプリケヌションで䜿甚できるようにしたす。 「デッド」オブゞェクトによっお占有されおいるメモリが完党にクリアされるず、ステヌゞは終了したす。 同時に、「生きおいる」オブゞェクトは、非垞に断片化されたペヌゞからのみ転送されたす。



ステヌゞの開始時に、メモリの特定のペヌゞぞのアクセスを制限するためにメモリ保護メカニズムを䜿甚しお、ガベヌゞコレクタは「ラむブ」オブゞェクトのメモリの他のペヌゞぞの転送を開始したす。 開始アドレスず新しいアドレスに関する情報は、「From」スペヌスずは別に取り出される「Forwarding Pointers」を持぀特別な配列に保存されたす。 すべおの「生きおいる」オブゞェクトが転送されるずすぐに、アプリケヌションスレッドが物理メモリを䜿甚できるようになりたす。 LVBは、「ラむブ」オブゞェクトの転送たたはこのオブゞェクトのアドレスの再定矩のプロセスが行われるメモリペヌゞぞのスレッドぞのアクセス詊行を決定するために䜿甚されたす。 ストリヌムコヌルをむンタヌセプトし、リンクの倀をTranslation Look-aside BufferTLS内のリンクず比范したす。 倀が珟圚進行䞭のリンクず䞀臎する堎合、割り蟌みが呌び出されたす。 この割り蟌みは、次のアクションを実行したす。ForwardingPointers配列の情報を䜿甚しお、オブゞェクトが既に移動されおいるかどうかが刀断されたす。 オブゞェクトが既に新しいメモリペヌゞに移動されおいる堎合、オブゞェクトぞの新しいリンクがストリヌムに返され、ロヌドされたオブゞェクトぞのリンクのアドレスが再定矩され、将来新しいリンクが䜿甚されるようになりたす。 オブゞェクトがただ移動されおいない堎合、割り蟌みは、ガベヌゞコレクタがこのオブゞェクトのあるメモリペヌゞを凊理するのを埅たずに、このオブゞェクトを移動したす。 その埌、フロヌが再開したす。 前の段階ず同じ「自己治療」の効果を䜿甚するず、決定論的な時間枠で運動の段階を完了するこずができたす。 たた、メモリ内のオブゞェクトを移動するステップを続行するよりも、今すぐマヌキングステップを実行する方が効率的であるずガベヌゞコレクタが決定した堎合、移動ステヌゞを匷制的に完了するこずができたす。



この段階を考えるずき、アルゎリズムず割り蟌みメカニズムのこの動䜜により、スレッドはガベヌゞコレクタヌがアドレスの移動ず曞き換えの凊理を完了するたで埅機せず、ガベヌゞコレクタヌがフロヌず実際に同時に動䜜し、「停止- the-world「䞀時停止。



リマップ



この段階では、移動されたすべおのオブゞェクト参照のアドレス曞き換えが完了し、移動されたオブゞェクトのヒヌプ内の叀い堎所ぞの参照がないこずが保蚌されたす。 これらのリンクは、再定矩段階の最初に存圚する堎合がありたす。これは、ヒヌプに、移動埌にスレッドがアクセスしなかったオブゞェクトぞのリンクが含たれおいる可胜性があるためです。 アドレス曞き換えフェヌズが完了するず、メモリ保護メカニズムが無効になり、Forwarding Pointers配列は䞍芁になりたす。 アドレスの曞き換えは次のように実行されたす。heap-e内のすべおの「ラむブ」オブゞェクトがスキャンされ、それらが新しいメモリペヌゞに移動されたオブゞェクトを指す堎合、リンクが再定矩されたす。 この段階はマヌキング段階ず䞀臎し、同時に実行されたす。 マヌキングプロセスは、生きおいるオブゞェクトを怜出しおマヌクし、NMTビットを「マヌクスルヌ」ずしお蚭定したす。 同時に、アドレス再割り圓おプロセスは、移動されたオブゞェクトぞのリンクを芋぀け、新しいアドレスに埓っおそれらを再定矩したす。 マヌキングおよびアドレス曞き換えプロセスのプロセス党䜓を通しお、「読み取りバリア」メカニズムは、転送されたオブゞェクトにアクセスするアプリケヌションスレッドを「キャッチ」し続け、新しいロケヌションアドレスをストリヌムに返す割り蟌みを匕き起こしたす。



したがっお、Azul C4は、「䞖界停止」の䞀時停止を匕き起こすこずなく、アドレスの曞き換えだけでなく、同時マヌキングを実行できたす。



Azul C4アルゎリズムの理論的な説明を芁玄するず、アプリケヌションがガベヌゞコレクタヌず同時に動䜜するこずを本圓に可胜にしおいるず蚀えたす。 LVBメカニズムは、JVMの党䜓的なスルヌプットをわずかに䜎䞋させたすが、「䞖界停止」の䌑止を完党に排陀しお、応答時間を最小限に安定させたす。 むンタヌネット䞊でサヌビスを提䟛するこずを専門ずする䌁業や、応答時間がビゞネスにずっお重芁なアプリケヌションにずっお、Azul C4は最も魅力的なJVMのように芋えたす。



これにもかかわらず、理論は実践によっお確認されなければなりたせん。 人生では、Azul JVMはハヌドりェアずしおも仮想マシンずしおも提䟛されたす。 Azul Vega 3ハヌドりェアプラットフォヌムは、金融䌚瀟ですでに確立されおいたす。 仮想Azul JVMの実装は、䞀郚はx86ハヌドりェアに展開できるずいう事実、䞀郚はJavaベヌスのアプリケヌションに向けられたタスクがより深刻になっおいるずいう事実により、䞖界で人気を博しおいたす。 ずころで、Azul C4はAzul JVMの唯䞀の利点ではありたせん。Azulを競合他瀟ず区別するいく぀かの違いがありたす。 これらの利点の詳现な説明には、この蚘事に必芁なだけのスペヌスが必芁です。したがっお、Azul JVM党般を怜蚎できる別の蚘事に残しおおくこずをお勧めしたす。 名前による堎合-これはDirectPathVMTM、オプティミスティックスレッドの同時実行、アプリケヌション実行の監芖ずプロファむリングです。



Azul SystemsのWebサむトでは、Azul-aの利点が応甚されおいる人生の事䟋を倚数芋るこずができたす。



Azul JVMを䜿甚しおいる䌁業



個人的な緎習から、倧䌁業の取匕䌚瀟であるAzul JVMの実装䟋を玹介できたす。





JVM構成



ネむティブ構成 アズヌル構成
-Xms2g -Xmx2g

-XX+ UseConcMarkSweepGC

-XX+ UseParNewGC

-XXTargetSurvivorRatio = 80

-XXCMSInitiatingOccupancyFraction = 85

-XXSurvivorRatio = 8

-XXMaxNewSize = 320m

-XXNewSize = 320m

-XXMaxTenuringThreshold = 10
-Xms3g –Xmx3g




䞊蚘のすべおをたずめるず、Azul C4で実装されたコンセプトは実際に実際に機胜し、最倧1テラバむトのサむズのヒヌプを持぀こずができ、ヒヌプサむズの蚭定ずGCの調敎に䌎う頭痛を解消できたす。安定した最小限のアプリケヌション応答時間を実珟したす。



Azul C4 Algorithmデヌタシヌト



All Articles