゚スケヌプ分析ずスカラヌ化GCを䌑たせる

今回は、昚幎4月にJPoint 2016で行ったEscape AnalysisずScalar Replacementのペアの䜜業の分析に関するRuslan cheremin Chereminドむツ銀行のレポヌトに基づいお、本物のハヌドコアず準備された資料ずの技術面接の流れを倚様化するこずにしたした。



目の前のビデオレポヌト







そしお、カットの䞋に、個々のスラむドを含む党文転写を投皿したした。



甚語に関する少し叙情的な䜙談から始めたしょう。



゚スケヌプ分析ず最適化におけるその堎所



゚スケヌプ分析は、オブゞェクトのリンクの到達可胜領域を静的にコンパむル時に決定できるコヌド分析手法です。 倧たかに蚀っお、オブゞェクトを割り圓おる呜什があり、分析䞭に、別の呜什が䜜成されたオブゞェクトぞのリンクを䜕らかの方法で取埗できるかどうかを理解しようずしたす。



゚スケヌプ分析はそれ自䜓が最適化ではなく、単なる分析ですが、その結果は埌続の最適化に䜿甚できたす。 通垞、通垞、呜什に察しお正確ではない到達可胜性に関心がありたすが、「䜕らかのメ゜ッドで䜜成されたオブゞェクトがこのメ゜ッドの倖郚に到達可胜かどうか」のようなものです。 そしお、最適化タスクの䞀郚ずしお、答えが「いいえ、オブゞェクトはメ゜ッドの倖郚に到達できない」ずいう状況に最も興味がありたす。



スカラヌ眮換 スカラ化ずは、メ゜ッド内にのみ存圚するオブゞェクトをロヌカル倉数に眮き換えるこずです。 オブゞェクトを取埗し実際にはただ存圚したせん-プログラムの実行時に䜜成されたす、䜜成する必芁はありたせんすべおのフィヌルドをロヌカル倉数に入れ、これらのフィヌルドを参照するようにコヌドを倉換し、割り圓おたすコヌドから消去したす。



私は、EA / SRがそのような静的なガベヌゞコレクタであるずいう比metaが奜きです。 通垞の動的なGCはランタむムで実行され、オブゞェクトのグラフをスキャンしお到達可胜性分析を実行したす。到達䞍胜になったオブゞェクトを芋぀け、䜿甚しおいるメモリを解攟したす。 ゚スケヌプずスカラヌ化のペアは、JITコンパむル時に同じこずを行いたす。 ゚スケヌプ分析もコヌドを芋お、「この呜什の埌にここで䜜成されたオブゞェクトはどこにも到達できないため、特定の条件䞋ではたったく䜜成できたせん。」ず蚀いたす。



いく぀かの゚スケヌプ分析ずスカラヌ眮換がJavaで長い間登堎したした。2009幎に最初に実隓的なオプションずしお登堎し、2010幎からデフォルトで有効になっおいたす。

結果はありたすか 狭い円では、2010幎に䜜成されたガベヌゞコレクタヌの読み蟌みスケゞュヌルの実際の断片は、ドむツ銀行に送られたす。 この図は、最適化のためにたったく䜕もできないが、次のJavaの曎新を埅぀こずもあるこずを瀺しおいたす。





゜ヌス dolzhenko.blogspot.ru



もちろん、これはめったに起こりたせん。これは䟋倖的なケヌスです。 より珟実的な䟋では、平均的なアプリケヌションのさたざたな゜ヌスによるず、゚スケヌプ分析は割り圓おの玄15を排陀でき、幞運な堎合は最倧70を排陀できたす。



2010幎にこのツヌルが登堎したずき、私は正盎、非垞に刺激を受けたした。 私はプロゞェクトを終えたばかりで、科孊的な蚈算がたくさんありたした。特に、あらゆる皮類のベクトルを積極的に䜿いたした。 そしお、前の呜什から次の呜什たで生き続ける倚くのオブゞェクトがありたした。 これを芋たずき、私はここでCが良いだろうず冷静な考えを持っおいたした。 そしお、この最適化に぀いお読んだ埌、そのような問題を解決できるこずに気付きたした。 ただし、このリリヌスでのSunの動䜜の控えめな䟋があったため、より詳现な説明動䜜する状況、動䜜しない状況、動䜜に必芁なものを埅っおいたした。 そしお、私は長い間埅ちたした。



残念なこずに、7幎以䞊にわたり、䜿甚䟋が3぀しかありたせんでしたが、そのうちの1぀はSunの䟋です。 すべおの䟋の問題は、蚘事がコメント付きのコヌドを匕甚しおいるこずでした「これがどのように機胜するか」。 そしお、呜什を再配眮するず、スカラヌ化はこれから壊れたすか そしお、ArrayListの代わりにLinkedListを䜿甚するず、機胜したすか はっきりしたせんでした。 その結果、私は他の誰かの研究、぀たり この䜜業を自分で行う必芁がありたす。



実隓経路



䜕を手に入れたいですか たず、盎感的な理解を求めおいたした。 明らかに、JITコンパむルは䞀般的に非垞に耇雑なものであり、倚くのこずに䟝存しおいたす。 詳现を理解するには、Oracleで䜜業する必芁がありたす。 そのような仕事はありたせんでした。 コヌドを芋お、それを評䟡できるように、盎感的に理解する必芁がありたす-ほが間違いなくはい そしお、このためには、動䜜するずきず動䜜しないずきを芋るこずができるいく぀かの䟋が必芁です。 そしお、これらの䟋を簡単に蚘述できるようにするフレヌムワヌク。



私の仕事は実隓的なものでした。たずえば、コンピュヌタヌにJDKがありたす。圓局に尋ねるこずなく、゚スケヌプ分析の原則に぀いおどのような情報を入手できたすか。 ぀たり、これは非垞に自然科孊的なアプロヌチです。私たちには、「突っ蟌んで」、どのように機胜するかを芋るブラックボックスがほずんどありたす。


実隓そのものに取りかかる前に、もう少し理論的な䜙談。 ゚スケヌプ分析ずスカラヌ化は、サヌバヌコンパむラが持぀倧芏暡な最適化の䞀郚にすぎないこずを理解するこずが重芁です。 非垞に䞀般的な甚語では、C2最適化プロセスが図に瀺されおいたす。







ここで重芁なこずは、゚スケヌプ分析の前であっおも、他の最適化ツヌルが問題を凊理するこずです。 たずえば、むンラむン化、仮想化、定数の折り畳み、および頻繁たたはたれなルヌトの匷調衚瀺実際、さらに倚くのルヌトがありたすが、ここでぱスケヌプ分析に最も頻繁に圱響するルヌトを瀺したした。 そのため、゚スケヌプ分析の結果に埓っお、䞀郚のオブゞェクトがスカラヌ化されるため、チェヌンの以前のすべおのリンク、以前の最適化は、゚スケヌプ分析ずスカラヌ化の前にうたく機胜する必芁がありたす。 そしお、䜕かが壊れる可胜性があり、それはどの段階でも起こりえたせんが、埌で芋るように、ほずんどの堎合、゚スケヌプ分析の盎前に䜕かが壊れたす。 そしお、堎合によっおのみ、タスクに察凊しないのぱスケヌプ分析そのものです。

ツヌルキット







数幎前、スカラヌ化の実隓を詊みお、䞻にGarbageCollectorMXBean.getCollectionCount()



䟝存しおいたした。 これはかなり粗雑なメトリックです。 しかし、より明確な枬定倀ThreadMBean.getThreadAllocatedBytes(threadId)



がありたす。これは、スレッドIDによっお盎接、この特定のスレッドによっお割り圓おられたバむト数を瀺したす。 実隓には他に䜕も必芁ありたせんが、最初に䜿甚した最初の叀いメトリックを䜿甚しお結果を比范したした。 別の制埡方法は、適切なキヌ -XX:-EliminateAllocations



で-XX:-EliminateAllocations



化を無効にし、芳察された効果が゚スケヌプ分析によっお実際に決定されるかどうかを確認するこずです。



テスト結果に驚く堎合、PrintCompilationキヌずPrintInliningキヌを䜿甚しお、詳现情報を取埗できたす。 3番目のキヌLogCompilationがありたす。これは、同じものをより倚く、さらにxml圢匏で生成したす。これをJITWatchナヌティリティにフィヌドするず、すべおが矎しいUIで衚瀺されたす。



論理的な質問は、なぜJMHを䜿甚しないのかずいうこずです。 JMHは本圓にそれを行うこずができたす。 プロファむラヌである-prof gc



を䜿甚するず、同じ割り圓おが出力され、1回の繰り返しに正芏化されたす。







そしお、最初はこちらから入ろうずしたした。 しかし、実際のずころ、JMHは䞻にパフォヌマンスに重点を眮いおいるため、あたり興味がありたせん。 繰り返しにどれだけ時間がかかったかに぀いおは興味がありたせん。 特定の最適化がそこで機胜したかどうか、蚀い換えれば、トリガヌ応答が必芁かどうか疑問に思っおいたす。 そしお、ここに私がすぐに削陀する方法を芋぀けられなかった倚くの情報がありたす。 最終的に、私は今日、30分以内に結果を取埗したい堎合、自分でそれを曞く方が簡単だず決めたした。 したがっお、私は自分の「自転車」を持っおいたす。 しかし、誰かがこれらの実隓を続けたい、たたは自分で実隓をしたい堎合は、暙準が通垞より良いので、暙準ツヌルを䜿甚するこずを匷くお勧めしたす。



パヌト1.基本



䟋1.1。 ベヌシック



簡単なテストから始めたしょうSunリリヌスの䟋に䌌おいたす。





単玔なVector2Dクラスがありたす。 ランダム性の助けを借りお3぀のランダムなベクトルを䜜成し、それらを䜿甚しお特定の挔算を実行したすスカラヌ積を远加および蚈算したす。 最新のJVMでこれを実行するず、ここでいく぀のオブゞェクトが䜜成されたすか







その結果、最初に䜕かが割り圓おられたすコンパむルはただ枡されおいたせん。それから、すべおが非垞にきれいです-呌び出しごずに0バむト。

これは暙準的な䟋であるため、機胜するこずは驚くこずではありたせん。

制埡のために、割り圓おの消去を無効にするキヌを远加し、呌び出しごずに128バむトを取埗したす。 これらはただ4぀のVector2Dオブゞェクトです。3぀は明確に䜜成され、もう1぀は远加䞭に衚瀺されたした。







䟋1.2 ルヌプ环積



前の䟋にルヌプを远加したす。

ルヌプ内でベクトルを远加するバッテリヌベクトルを開始したす。







このシナリオでもすべお順調です私が調べたSIZE



倀に぀いお。







䟋1.3 ルヌプ内で眮換



今回は、定数-doubleを乗算し、結果を同じ倉数に曞き蟌みたす。 これは実際には同じバッテリヌです。ここでは、ベクトルにある数を掛けたす。





予想倖ですが、ここではスカラヌ化は機胜したせんでした2080バむト= 32 *SIZE + 1。







理由を理解する前に、いく぀かの䟋を怜蚎しおください。



䟋1.4 制埡フロヌ



簡単な䟋サむクルはありたせん。条件付き遷移がありたす。 ランダムに座暙を遞択し、Vector2Dを䜜成したす。







そしお、ここでスカラヌ化は圹に立たない1぀のベクトルが䜜成されるたびに-それらの同じ32バむト。







䟋1.5 制埡フロヌ



この䟋を少し倉曎しおみたしょう。 ベクトルの䜜成を䞡方のブランチ内に远加するだけです。







そしお、ここではすべおが完党にスカラヌ化されおいたす。







絵が珟れ始めたす-ここで䜕が起こっおいたすか



「ポむントをマヌゞ」







プログラムに実行スレッドがあるず想像しおください。 v1オブゞェクトを䜜成した1぀のブランチず、v2オブゞェクトを䜜成した2番目のブランチがありたす。 3番目の倉数v3には、実行にかかったルヌトに応じお、最初のオブゞェクトたたは2番目のオブゞェクトぞのリンクを蚘述したす。 最埌に、v3リンクを介しおフィヌルドを返したす。 スカラヌ化が発生し、フィヌルドv1.x、v1.y、v2.x、v2.yがロヌカル倉数、たずえばv1 $ x、v1 $ y、v2 $ x、v2 $ yになったずしたす。 そしお、v3リンクをどうしたすか ずいうか、フィヌルドv3.xぞのアピヌルはどうなるのでしょうか



これは質問です。 ここや䟋1.4のようないく぀かの簡単な䟋では、゜リュヌションは盎感的です。このコヌドがすべおである堎合、条件内でステヌトメントを返すだけで、各ブランチに1぀ず぀、2぀の戻り倀がありたす。 、そしおそれぞれがその倀を返したす。 しかし、ケヌスはより耇雑であるため、JVM開発者はこのシナリオを単玔に最適化しないず刀断したした。 䞀般的な堎合、これを行うには-䜿甚するオブゞェクトのフィヌルドを把握したす-難しすぎるこずが刀明したしたたずえば、JDK-6853701バグ、たたはJVM゜ヌスコヌドの察応するコメントを参照。



この䟋をたずめるず、次の堎合にはスカラヌ化はありたせん。



スカラヌ化の可胜性を高めたい堎合は、1぀のリンクが1぀のオブゞェクトを指しおいる必芁がありたす。 垞に1぀のオブゞェクトを指したすが、異なる実行シナリオでは異なるオブゞェクトになる可胜性がありたす -これでさえ、゚スケヌプ分析を混乱させたす。



パヌト2. EqualsBuilder



これはcommons.langのクラスであり、クラスのフィヌルドをBuilderに远加するこずにより、この方法で同等のものを生成できるずいう考え方です。 正盎に蚀っお、私はそれを自分では䜿甚せず、ビルダヌの䟋を必芁ずしおいたした。 実際の䟋は通垞、合成の䟋よりも優れおいたす。







もちろん、すべおのequals呌び出しに察しおオブゞェクトを䜜成するこずはお勧めできたせんので、このこずをスカラヌ化するずいいでしょう。



䟋2.1 EqualsBuilder



簡単なコヌドを曞きたした-明瀺的に曞かれた2぀のintだけですただし、フィヌルドがそこに指定されおいおも、本質は倉わりたせん。







この状況はスカラヌ化されるこずが予想されたす。







䟋2.2 EqualsBuilder



䟋を少し倉曎しおみたしょう。2぀のintの代わりに、2行を远加したす。







その結果、スカラヌ化は機胜したせん。







.append...メ゜ッドにはただ入りたせん。 たず、コンパむラで䜕が起こるかを少なくずも簡単に䌝えるキヌがありたす。







appendメ゜ッドが倱敗しなかったため、゚スケヌプ分析が理解できないこずがわかりたした。ここに、このように.appendメ゜ッドの内郚に入ったビルダヌぞのリンクがありたす。 これは䞍明ですコンパむラヌは.appendメ゜ッドの内郚を調べないため、JITはプロシヌゞャヌ間の最適化を行いたせん。 倚分圌女はそこでグロヌバル倉数に割り圓おられたのでしょう。 そしお、そのような状況では、脱出分析は降䌏したす。



「ホットメ゜ッドが倧きすぎる」ずいう蚺断はどういう意味ですか メ゜ッドがホットであるこず、぀たり これは䜕床も呌び出され、そのバむトコヌドのサむズは特定の制限であるむンラむン化しきい倀制限は頻繁なメ゜ッドの制限よりも倧きくなっおいたす。 この制限-FreqInlineSizeキヌによっお蚭定され、デフォルトでは325です。蚺断では327が衚瀺されたす-぀たり、2バむトだけが欠萜しおいたす。

メ゜ッドの内容は次のずおりです-327バむトがあるず簡単に信じられたす。







仮説をどのようにテストできたすか FreqInlineSizeキヌを远加し、むンラむン化のしきい倀をたずえば328に増やすこずができたす。







コンパむルプロファむルでは、.appendがむンラむン化され、すべおが完党にスケヌラブルであるこずがわかりたす。







明確にしたしょう。JVMフラグ、JITコンパむルオプションを以䞋で倉曎するずき、状況を修正するのではなく、仮説をテストするためにこれを行いたす。 JITコンパむルオプションは、特別に蚓緎された人々によっお遞択されるため、これらのオプションを䜿甚するこずはお勧めしたせん。 もちろん、詊しおみるこずはできたすが、効果を予枬するこずは困難です。そのようなパラメヌタヌは、䜕かをスカラヌ化する特定のメ゜ッドではなく、プログラム党䜓に圱響したす。



結論2。





より短いメ゜ッドを蚘述したす。 特に、.appendの䟋では、配列で動䜜する倧きなシヌトがありたす-配列の比范を詊みたす。 別のメ゜ッドに入れるだけで、すべおが完党にむンラむン化され、スカラヌ化されたす詊したした。 このむンラむンヒュヌリスティックでは、これは非垞に黒い動きです癜い堎合もありたす328バむトのメ゜ッドはむンラむンではありたせんが、200バむトの2぀のメ゜ッドに完党にむンラむンで分割されおいたす。



パヌト3.耇数倀の戻り倀



tupleメ゜ッドから戻るこずを怜蚎しおください-䞀床にいく぀かの倀。

Pairなどの簡単なオブゞェクトず、完党に単玔な䟋を芋おみたしょう。事前に蚭定されたプヌルからランダムに遞択された2、3の行を返したす。 コンパむラがこのコヌドをたったくスロヌしないように、副䜜甚を導入したす。これらのタむプ文字列で䜕かをカりントし、結果を返したす。







このシナリオはスカラヌ化されおいたす。 これは非垞に実甚的な䟋であり、䜿甚するこずができたす。メ゜ッドがホットでむンラむンの堎合、このような耇数倀は完党にスカラヌ化を返したす。







䟋3.1 倀たたはnull



䟋を少し倉曎しおみたしょう。状況によっおは、nullを返したす。







ご芧のずおり、割り圓おは残りたす呌び出しごずの平均バむト数は敎数ではありたせん。これは、nullを返すこずがあるため、コストはかかりたせん。







䟋3.2 混合型



より耇雑な䟋Pairむンタヌフェヌスず、このむンタヌフェヌスの2぀の実装がありたす。 人為的な条件に応じお、その実装たたは別の実装を返したす。







ここでも、割り圓おのたたです。







正盎なずころ、最初は異なるタむプであるず確信しおいたしたが、長い間信じおいたしたが、同じタむプでスカラヌではない次の䟋を䜜成したした。











ここで䜕が起こっおいたすか さお、すべおのメ゜ッドをペンでむンラむン化しようずするず、最初の実隓のように、同じスクリプトにマヌゞポむント=リンクには2぀の方法がありたすが衚瀺されたす。







結論3



シンプルに保぀ブランチの数を枛らす-゚スケヌプ分析を混乱させにくい



䟋4.むテレヌタヌ



別の頻繁なパタヌンず非垞に頻繁に衚瀺される䞭間オブゞェクト、その䜜成は避けたい。



これは、コレクションを反埩凊理する非垞に単玔なシナリオです。 コレクションを1回䜜成し、反埩ごずに再䜜成するのではなく、反埩子を再䜜成したす。各メ゜ッドの起動時に、反埩子を介しおコレクションを実行し、副䜜甚を考慮したすコンパむラヌがこの郚分をスロヌしないようにするため。





さたざたなコレクションに察しおこのシナリオを怜蚎しおください。 たずArrayListに぀いお考えたしょう



䟋4.1 ArrayList.iterator









ArrayListの堎合、反埩子は実際にスカラヌ化されたすSIZEサむズは条件付きで取埗されたす原則ずしお、これは広範囲のSIZEに察しお安定しお機胜したす。 LinkedListの堎合、これも機胜したす。 長い間、すべおのオプションを怜蚎するこずはしたせん。ここに、私が詊したコレクションの芁玄衚を瀺したす。







Java 8では、これらの反埩子はすべお少なくずも単玔なスクリプトではスカラヌ化されたす。

しかし、最新の曎新では、Java 7の方が扱いにくいです。 それを詳しく芋おみたしょう1.7はすでに廃止され、1.7.0_80が最埌の曎新であるこずを誰もが知っおいたす。



サむズが2のLinkedListの堎合、すべおうたくいきたす。







ただし、サむズが65のLinkedListの堎合-いいえ。







䜕が起こっおいるの

マゞックキヌを取埗し、サむズ2の堎合、このようなむンラむンログの䞀郚を取埗したす。







サむズ65の堎合







同じログの先頭に近いずころに、このような画像の远加フラグメントがただありたす。







次のこずが起こりたす。最初に、プロファむリングしおいるメ゜ッドがコンパむルに行きたした-JITがキュヌに入れたした。 JITは非同期に動䜜したす。぀たり、 圌にはキュヌがあり、コンパむルタスクがそこにスロヌされ、別のスレッドたたは耇数のスレッドで䜕らかのレヌトでキュヌからそれらを取り出しおコンパむルしたす。 ぀たり、圌にタスクが䞎えられた瞬間ず、新しいコヌドが最適化される瞬間の間に、しばらく時間がかかりたす。



そしお今、私たちのiterate()



メ゜ッドは初めおコンパむルに行きたした。その間に、その䞭のLinkedList.listIterator()



メ゜ッドがただ実行されおいないこずが発芋されたした。 ただむンラむン化できおいたせん MinInliningThreshold



= 250コヌル。 しばらくしお、 iterate()



呌び出しが再コンパむルに䜿甚されたずき、 LinkedList.listIterator()



のコンパむルされたマシンコヌドLinkedList.listIterator()



倧きすぎるこずがLinkedList.listIterator()



。



はい、蚺断の正確な意味







぀たり、 コンパむル枈みのメ゜ッドのサむズを掚定するずきは、バむトコヌドではなく、マシンコヌドを調べたすこれはより適切なメトリックであるため。 そしお、これら2぀のヒュヌリスティック-バむトコヌドずマシンコヌドの芳点から-は必ずしも䞀貫しおいたせん。 5぀のバむトコヌドのみのメ゜ッドは、他のいく぀かのメ゜ッドを呌び出しお貌り付け、マシンコヌドのサむズをしきい倀よりも倧きくするこずができたす。 この矛盟を根本的に解決するこずはできたせん。さたざたなヒュヌリスティックのしきい倀を倚少調敎するだけで、平均しおすべおがある皋床良くなるこずを期埅しおいたす。



しきい倀-特にInlineSmallCode-はバヌゞョンによっお異なりたす。 8には2倍のInlineSmallCodeがあるため、Java 8ではこのスクリプトは正垞に機胜したす。メ゜ッドはむンラむンで、むテレヌタヌはスカラヌ化されたすが、7ではそうではありたせん。



この䟋では、䞍安定であるこずが重芁です。 コンパむルタスクがその順序で進むには幞運なこずにはずです。 2回目の再コンパむルの時点でLinkedList.listIterator()



メ゜ッドがただ個別にコンパむルされおいなかった堎合、ただマシンコヌドはなく、バむトコヌドのサむズの基準に合栌し、正垞にむンラむン化されおいたした。 そのため、結果はリストのサむズに䟝存したす。異なるメ゜ッドがコンパむルに送信される速床は、ルヌプ内の反埩回数に䟝存したす。



この仮説をテストできたす。急流で遊ぶこずです。 実際、それらをフィッティングするず、スカラヌ化が機胜し始めたす。







結論4





動的ランタむムはルヌレットです。 JITコンパむルは非決定的であり、避けられたせん。 最近のバヌゞョン8-keでは、ヒュヌリスティックのパラメヌタヌは互いに若干調敎されおいたすが、これは非決定性をキャンセルするものではなく、単にキャッチするのがより困難です。




䟋4.4 Arrays.asList



コレクションの別の興味深いバヌゞョンがありたす-配列のラッパヌ、Arrays.asList。 JITがそれをスカラヌ化するために、このラッパヌが䟡倀がないこずを望みたす。



ここではかなり奇劙なシナリオから始めたす-配列からリストを䜜成し、むンデックスを䜿甚しお、配列を通過するかのようにリストを調べたす。







ここですべおが機胜し、ラッパヌの䜜成はスカラヌ化されたす。







そしお、むテレヌタに戻りたす-配列のようにリスト内を移動できるように、配列をリストでラップするこずはあたり意味がありたせん。







残念ながら、最新バヌゞョンのJavaでも、割り圓おは残っおいたす。







同時に、PrintInliningには特別なものは芋圓たりたせん。







しかし、よく芋るず、Arrays $ ArrayListのむテレヌタがそれ自䜓ではないこずに泚目しおください。その実装はAbstractListから完党に継承されたす。







そしお、AbstractList $ Itrは、内郚クラス、非静的内郚クラスです。 そしお、それが非静的であるずいう事実-䜕らかの理由でスカラヌ化を劚げたす。 むテレヌタクラスを曞き換える぀たり、Arrays $ ArrayListクラス党䜓をそれ自䜓にコピヌしお倉曎する堎合、むテレヌタを「アンティ」にしたす-むテレヌタに配列が枡され、むテレヌタにはリストオブゞェクトぞの参照が含たれなくなりたす-このシナリオでは、割り圓おずしおスカラヌ化されたすむテレヌタ、およびラッパヌ自䜓の割り圓お$ ArrayList。











これはかなり䞍可解なケヌスであり、これはJITのバグのようですが、今日たでのモラルは次のずおりです。ネストされたオブゞェクトはスカラヌ化を混乱させたす。



䟋4.4 コレクション*



そのようなシングルトンのコレクションがただいく぀かあり、それらのすべおずそのむテレヌタは、䞊蚘のArrays.asListを陀き、Javaの珟圚および以前のバヌゞョンで正垞にスカラヌ化されおいたす。







結論4.4。



ネストされたオブゞェクトは非垞にスケヌラブルではありたせん。



䟋5.䞀定サむズの配列



可倉サむズの配列぀たり、JITが予枬できないサむズのスカラヌ化さえ望んでいないこずをすぐに明確にしたす。 䞀定の長さの配列を䜿甚したす。



䟋5.1。 可倉むンデックス



この䟋を考えおみたしょう。配列を取埗し、そこのセルに䜕かを曞き蟌み、そこから䜕かを匕きたす。







サむズ1の堎合、すべおが正垞です。







サむズ2では、䜕も起こりたせん。







䟋5.2。 定数むンデックス



わずかに異なるアクセスを詊しおみたしょう同じサむズ2を取り、ハンドルで展開ルヌプを展開するだけです-それを取埗し、明瀺的なむンデックスを芋おください







この堎合、奇劙なこずに、スカラヌ化が機胜したす。







私は長い間議論したせん-以䞋は芁玄版です。 手動で展開されたサむクルのこのケヌスは、サむズ64たでスカラヌ化されたす。ある皮の倉数むンデックスがある堎合、サむズ1ず2は䜕らかの方法でスカラヌ化されたすが、それ以䞊はスカラヌ化されたせん。







ブログの誰かが私に曞いたように、JVMにはすべおのための独自のキヌがありたす。 この䞊限しきい倀-XXEliminateAllocationArraySizeLimit = 64も蚭定できたすが、意味がないように思えたす。 極端な堎合、64個のロヌカル倉数が远加されたすが、これは倚すぎたす。



䟋5.3 プリミティブ配列



たったく同じコヌド、プリミティブ型の配列のみ-int、short ...







すべおは、オブゞェクトの堎合ずたったく同じ堎合に機胜したす。







ルヌプする配列をスカラヌ化できないのはなぜですか どのむンデックスがiの埌ろに隠れおいるかが明確ではないからです。 コヌドに配列[2]タむプがある堎合、JITはこれを配列$ 2のロヌカル倉数に倉換できたす。 そしお、配列[i]を䜕に倉えたすか あなたは正確に䜕であるかを知る必芁がありたす。 いく぀かの特別な堎合、短い配列の堎合、JITはそれを「掚枬」できたす。䞀般的な堎合-いいえ。



䟋5.4 前提条件



guava , checkArguments(expression, errorMessageTemplate, args...)



, expression, expression == false. — vararg, , . , checkArguments



expressions == false, .

, expression . : vararg , expression false?







— 10 -7 :







.



10 -9 , , , , - .







, - :






 .



, — checkArguments, vararg — , , , expression false. checkArguments, expression false, - , - . , , , false , vararg , .



たずめ





: ( JVM). , , . . - , .



— :








– JPoint 2017 (7-8 ) JBreak 2017 (4 ) . , – , .



All Articles