Java 12が登堎したした ホットJEPのレビュヌ


6か月が経過したした。぀たり、 新しいJavaをむンストヌルするずきです。 長い旅でしたが、最埌に到達した人はほずんどいたせんでした。 未加工の行は興味深いJEPから倖れたしたが、残りの郚分に぀いおは説明したす。


すべおはどうですか


Javaの新しいバヌゞョンのリリヌスは、玄6か月の長さの新しい「加速された」リリヌスサむクルに埓っお行われたす。 正確な日付はプロゞェクトペヌゞで定矩されおいたす 。 JDK 12にはいく぀かの䞻芁なフェヌズがありたした。



このスケゞュヌルから䜕が埗られたすか はい、実際のずころ、䜕もありたせん。フィニッシュラむンにたどり着いたばかりで、新しい新鮮なJDK 12の頂点からレガシヌの愛奜家を芋守っおいたす。


バグ パニック 䞀番䞋たで



新しい非LTSバヌゞョンがリリヌスされたずき、通垞誰もが新機胜に぀いお気にしたせん。 すべおが地獄に厩れるならもっず面癜いです。


もちろん、倚くのバグがありたすが、JDK 12にはありたせん:) jirから刀断するず、すべおが正垞です。



「ノルム」ずは䜕かを正確に理解できるように、リク゚ストを匕甚したす。


project = JDK AND issuetype = Bug AND status in (Open, "In Progress", New) AND priority in (P1) AND (fixVersion in (12) OR fixVersion is EMPTY AND affectedVersion in (12) AND affectedVersion not in regexVersion("11.*", "10.*", "9.*", "8.*", "7.*", "6.*")) AND (labels is EMPTY OR labels not in (jdk12-defer-request, noreg-demo, noreg-doc, noreg-self)) AND (component not in (docs, globalization, infrastructure) OR component = infrastructure AND subcomponent = build) AND reporter != "Shadow Bug" ORDER BY priority, component, subcomponent, assignee 

もちろん、 䞀般的なバグにはあるべき堎所がありたすが、そのような巚倧なプロゞェクトではどこにも行きたせん。 珟時点ではP1のバグに気付いおいないずいうだけです。


バグずのより正匏なコミュニケヌションは、特別なドキュメントJEP 3JDK Release Processで宣蚀されおいたす。これは、Java Oceanの乱流に関する䞍滅のスチュワヌドであるMark Reinholdが所有しおいたす。


特に、次のこずを䌝える段萜を掘り䞋げる䟡倀がありたす。 誰が責任を負い、䜕をすべきか 12回目のリリヌスの時間がない堎合のチケットの転送方法。 Nがどのリリヌスから転送したいかを瀺すラベルjdk$N-defer-requestをバグトラッカヌに入れ、コメントを残す必芁がありたす。最初の行はDeferral Requestです。 さらに、そのようなすべおの芁求のレビュヌは、それぞれの分野およびプロゞェクトのリヌドによっお行われたす。


TCKを枡す問題はこの方法では無芖できたせん。JavaがJavaのたたであり、カ゚ルのようなものではないこずが保蚌されたす。 jdk$N-defer-request labelが消えるこずはありたせん。 タグを削陀しないずいうルヌルに違反しおいる人々に察しお圌らが䜕をするかは興味深いです。モルモットに逌を䞎えるこずをお勧めしたす。


ただし、この方法では、JDK 13に移怍されたバグの数を確認できたす。このク゚リを詊しおみたしょう。


 project = JDK AND issuetype = Bug AND status in (Open, "In Progress", New) AND (labels in (jdk12-defer-request) AND labels not in (noreg-demo, noreg-doc, noreg-self)) AND (component not in (docs, globalization, infrastructure) OR component = infrastructure AND subcomponent = build) AND reporter != "Shadow Bug" ORDER BY priority, component, subcomponent, assignee 

JDK-8216039の 1ピヌスのみ「BCおよびRSASSA-PSSを䜿甚したTLSはECDHServerKeyExchangeを䞭断したす」。 厚くない それでもこの議論が圹に立たない堎合は、匁護士ずしお鎮静剀を詊すこずをお勧めしたす。


そしお、䞀番䞋の行は䜕ですか



ほずんどの機胜がナヌザヌJavaプログラマヌではなく、OpenJDK自䜓の開発者に圱響するこずは明らかです。 したがっお、念のため、機胜をexternalずinternalに分けたす。 あなたは内郚のものをスキップするこずができたすが、私は腹を立おおいたす、私はたくさんのテキストを曞きたした。


189 シェナンドヌ䞀時停止時間の短いガベヌゞコレクタヌ実隓的


倖郚機胜 。 芁するに、特にSLAが10〜500ミリ秒のオヌダヌの応答性を必芁ずする堎合、Javaの速床が䜎䞋するず、人々はそれを奜たなくなりたす。 これで、この範囲の巊端に近づくように動䜜する無料の䜎パンチGCができたした。 トレヌドオフは、CPUずRAMを亀換しお埅ち時間を短瞮するこずです。 ヒップタグ付けず圧瞮フェヌズは、ラむブアプリケヌションスレッドず䞊行しお動䜜したす。 残りの小さな䞀時停止は、オブゞェクトのグラフのルヌトを怜玢および曎新する必芁があるためです。


䞊蚘のいずれも意味をなさない堎合、それは問題ではありたせん。シェナンドアは、基瀎ずなるプロセスを理解しおいるかどうかに関係なく動䜜したす。


Alexei Shipilev、Kristina Flood、Roman Kennkeが取り組んでいたす。これらの人々に぀いお知らないように䞀生懞呜努力する必芁がありたす。 GCの仕組みを䞀般的に理解しおいるのに開発者が䜕ができるか想像しおいない堎合は、玠晎らしいLeshinaの蚘事「OpenJDK向けの自家補ガベヌゞコレクタヌ」たたはJVM Anatomy Quarksシリヌズのすばらしい翻蚳をご芧になるこずをお勧めしたす。 これはずおもおもしろいです。


非垞に重芁です。 Oracleは、Shandoahのリリヌスビルドをjdk.java.netのものもoracle.comのものも含めお出荷しないこずにしたした。 ShenandoahはJDK 12の最も重芁な機胜の1぀であるため、たずえばAzulからの公匏アセンブリをむンストヌルする䟡倀がありたす。



230 Microbenchmark Suite


内郚機胜 。 マむクロベンチマヌクを䜜成しようずしたこずがあるなら、これはJMHで行われおいるこずがわかりたす。 JMHは、Javaおよび他のJVM蚀語のマむクロベンチマヌクを䜜成、アセンブル、実行、および分析するためのフレヌムワヌクであり、 誰がそれを曞いたかを理解しおいたすすべおの䞀臎はランダムです。 残念ながら、「通垞の」アプリケヌションの䞖界で行われおいるすべおがJDK内に適甚できるわけではありたせん。 たずえば、通垞のSpring Frameworkコヌドがそこに衚瀺されるこずはほずんどありたせん。


幞いなこずに、バヌゞョン12以降、少なくずもJMHを䜿甚できたす。たた、JMHには䞀連のテストがすでに蚘述されおいたす。 jdk/jdk/test/micro/org/openjdk/bench確認できたすブラりザで盎接確認できたす。このパスはリンクです。


たずえば、GCテストは次のようになりたす。


ここにStackOverflowがないこずを思い出しおください。 察応するファむルずOpenJDKプロゞェクトのすべおのラむセンスを読んで芳察するこずなく、コピヌアンドペヌストのコヌドをここず以降で䜿甚するこずは犁じられおいたす。そうしないず、最埌の靎䞋を簡単に入手できたす。

 @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) @State(Scope.Thread) public class Alloc { public static final int LENGTH = 400; public static final int ARR_LEN = 100; public int largeLen = 100; public int smalllen = 6; @Benchmark public void testLargeConstArray(Blackhole bh) throws Exception { int localArrlen = ARR_LEN; for (int i = 0; i < LENGTH; i++) { Object[] tmp = new Object[localArrlen]; bh.consume(tmp); } } //... } 



325匏の切り替えプレビュヌ


倖郚機胜 。 これは、3画面以䞊の長さの゚ンドレススむッチを䜜成するアプロヌチを根本的に倉曎したす。 芋お


Virgin Java Switch vs ...


 int dayNum = -1; switch (day) { case MONDAY: case FRIDAY: case SUNDAY: dayNum = 6; break; case TUESDAY: dayNum = 7; break; case THURSDAY: case SATURDAY: dayNum = 8; break; case WEDNESDAY: dayNum = 9; break; } 

悪い理由 文字がたくさんあるので、䌑憩をスキップできたす特に、あなたが䞭毒者であるか、ADHDにかかっおいる堎合。


... vs Chad Java Swtich Expression


 int dayNum = switch (day) { case MONDAY -> 0; case TUESDAY -> 1; default -> { int k = day.toString().length(); int result = f(k); break result; } }; 

なぜ良いのか 数文字、安党、䟿利、新しいクヌルな機胜


ボヌナス あなたがサディストなら、䜕千ものIDE開発者がこの機胜のサポヌトに苊しんでいるので、それはあなたに最も深い満足を䞎えたす。 はい、はい、はい 4月6日のレポヌトの埌に圌を捕たえ、すべおの汚れた詳现を䞁寧に䌝えるように頌むこずができたす。


これはプレビュヌ機胜であり、機胜したせん。 コンパむル時には、 javacコマンドラむンオプション--enable-preview --release 12を枡し、 javaを実行する必芁がありたす --enable-previewフラグのみ。



334 JVM定数API


内郚機胜 。 開発者はクラスファむルを操䜜する必芁がありたす。 これを䟿利に行う必芁があり、これが問題のステヌトメントです。 少なくずも、このJEPを所有しおいるブラむアンゲッツはこう蚀っおいたす:-)これらはすべお、より倧きな戊堎の䞀郚ですが、今のずころは深く入りたせん。


各Javaクラスには、いわゆる「定数プヌル」があり、いく぀かの倀文字列や敎数など、たたはクラスやメ゜ッドなどのランタむム゚ンティティのダンプがありたす。 ldc- "load costant"呜什を䜿甚しおこのダンプを掘り䞋げるこずができるため、このすべおのゞャンクはロヌド可胜定数ず呌ばれたす。 invokedynamicにはただ特別なケヌスがありたすが、気にする必芁はありたせん。


クラスファむルで䜜業する堎合、バむトコヌド蚈噚をシミュレヌトするのが䟿利です。したがっお、ロヌド可胜な定数です。 最初の欲求は、察応するJava型を単玔に䜜成するこずですが、それらに「生きおいる」クラスであるCONSTANT_Class_info構造䜓を衚瀺するにはどうすればよいですか Classオブゞェクトは、クラスロヌディングの正確さず䞀貫性に䟝存し、Javaでのクラスのロヌディングにより、地獄のようなバチャナリアが䜜成されたす。 そもそも、すべおのクラスをVMにロヌドできるわけではありたせんが、それらを蚘述する必芁がありたす


クラス、メ゜ッド、メ゜ッドハンドルや動的定数などのあたり知られおいない獣など、これらの埮劙な点をすべお考慮しお、䜕らかの圢で管理したいず思いたす。


これは、 倀に基づいた新しいタむプのシンボリックリンク JVMS 5.1の意味を導入するこずで解決されたす。各シンボリックリンクは、特定のタむプの定数を蚘述しおいたす。 クラスのロヌドやアクセスの問題から分離しお、玔粋に名目䞊説明したす。 圌らはjava.lang.invoke.constantようなパッケヌゞに䜏んでいお、それを芁求したせんが、 ここでパッチを芋るこずができたす 。



340 2぀ではなく1぀のAArch64ポヌト
倖郚機胜 。 すでにJDK 9では、OracleずRed Hatが同時にARMポヌトをアラヌト状態にするずいう奇劙な状況がありたした。 そしお、物語の終わりが芋えたす。オラクロフ枯の64ビット郚分が䞊流から削陀されたした。


長い歎史を掘り䞋げるこずは可胜ですが、もっず良い方法がありたす。 BellSoftはこのJEPの開発に参加し、そのオフィスはサンクトペテルブルクのオラクルの旧オフィスの隣にありたす。


したがっお、すぐにBellSoftのCTOであるAlexey Voitilovに目を向けたした。


「BellSoftは、x86 Linux / Windows / MacおよびSolaris / SPARCに加えお、ARMをサポヌトするLiberica JDKを起動したす。ARM甹JDK 9から、サヌバヌアプリケヌションのAARCH64ポヌトのパフォヌマンスの改善に焊点を圓お、ARMポヌトの32ビット郚分のサポヌトを継続したしたそのため、JDK 11のリリヌス時には、OracleOracleを含むの64ビットポヌト郚分を誰もサポヌトしおいない状況があり、OpenJDKコミュニティはAARCH64ポヌトに集䞭するために64ビットポヌト郚分を削陀するこずを決めたした。参照、䟋えば、 JEP 315 、これは我々 JDK 12に統合されおおり、JDK 12以降、Oracleのポヌトにあるすべおの機胜をサポヌトしおいたす最埌の機胜、9月に統合したMinimal VM。したがっお、JDK 12でこの基本を削陀できるようになりたした。コミュニティはAARCH64の1぀のポヌトず1぀のARM32のポヌトを受け取りたした。もちろん、サポヌトが容易になりたす。



341 デフォルトのCDSアヌカむブ


内郚機胜 。 問題は、Javaアプリケヌションの起動時に、数千のクラスがロヌドされるため、起動時にJavaが倧幅に遅くなるずいう感芚を生み出したす。 しかし、嘘を぀くのは誰ですか、これは単なる「感芚」ではありたせん-そうです。 叀代から問題を解決するために、さたざたな儀匏が実践されおいたす。


クラスデヌタの共有は、JDK 8 Update 40の商甚機胜のように、 倪叀から私たちにやっおきた機胜です。このスタヌトアップガベヌゞをすべお、独自の圢匏のアヌカむブにパックするこずができたすどの圢匏かを知る必芁はありたせん。アプリケヌションが増えおいたす。 そしおしばらくしお、 JEP 310が登堎したした。アプリケヌションクラスずデヌタの共有。これにより、システムクラスだけでなく、アプリケヌションクラスも同じように扱うこずができたした。


JDKクラスの堎合、次のようになりたす。 たず、 java -Xshare:dumpコマンドでクラスをダンプしおから、アプリケヌションを実行しお、このキャッシュを䜿甚するように指瀺したす java -Xshare:on -jar app.jar 。 すべお、スタヌトアップは少し改善されたした。 この機胜に぀いお知っおいたしたか ただ知らない倚くの人


ここでは奇劙に芋えたすなぜ毎回-Xshare:dump JDKディストリビュヌションを䜜成する段階でもこのコマンドのデフォルト結果がわずかに予枬可胜な堎合、 -Xshare:dumpするのはなぜですか 文曞によるず、むンストヌラヌを䜿甚しおJava 8ディストリビュヌションがむンストヌルされた堎合、むンストヌル時に必芁なコマンドを実行する必芁がありたす。 同様に、むンストヌラヌは隅々で静かに採掘しおいたす。 しかし、なぜですか そしお、むンストヌラヌずしおではなく、zipファむルずしお配垃される配垃をどうするか


簡単です。JDK12以降、CDSアヌカむブは、リンクの盎埌に配垃キットの䜜成者によっお生成されたす。 ナむトビルドの堎合でもクロスコンパむル甚ではなく、64ビットでネむティブである堎合。


JDK 11以降、デフォルトで-Xshare:auto有効になり、このようなアヌカむブが自動的に-Xshare:autoため、ナヌザヌはこの機胜の存圚に぀いお知る必芁さえありたせん。 したがっお、 JDK 12に曎新するだけで、アプリケヌションの起動が高速化されたす。



344 G1の䞭止可胜な混合コレクション


内郚機胜 。 正盎に蚀うず 私はG1の仕事で䜕も理解しおいたせん GCの機胜の説明は、ありがたい仕事です。 説明者ず理解の䞡方から圌の䜜品の詳现を理解する必芁がありたす。 ほずんどの人にずっお、GCは、䜕らかの堎合にごたかすこずができる嗅ぎタバコの䞀皮の地獄です。 したがっお、問題は䜕ずか簡単に説明する必芁がありたす。


問題 G1の方がうたくいくかもしれたせん。


問題は、GCが倚くのパラメヌタヌの劥協点であり、その1぀が䞀時停止の長さであるずいうこずです。 䞀時停止が長すぎる堎合があり、それをキャンセルできるず䟿利です。


これはい぀起こりたすか G1はアプリケヌションの動䜜を実際に分析し、その結論に基づいお䜜業の最前線 コレクションセットずしお衚されるを遞択したす。 䜜業範囲が承認されるず、G1はコレクションセット内のすべおの生きおいるオブゞェクトを、頑固か぀ノンストップで䞀床に収集するこずを玄束したす。 時間がかかりすぎる堎合がありたす。 本質的に、これはG1が䜜業量を誀っお蚈算したこずを意味したす。 アプリケヌションの振る舞いを突然倉曎するこずで、圌がだたされる可胜性がありたす。これにより、コレクションセットに倚くの叀い領域が入ったずきに、ヒュヌリスティックが䞍良デヌタの䞊で動䜜するようになりたす。


状況から抜け出すために、G1は次のメカニズムによっおファむナラむズされたしたヒュヌリスティックが定期的に誀った䜜業量を遞択する堎合、G1はむンクリメンタルガベヌゞコレクションにステップバむステップで切り替え、次の各ステップタヌゲット実行時間に収たらない堎合をキャンセルできたす。 䜕かを少しず぀収集するのは理にかなっおいない若い地域ので、そのような䜜業はすべお「必須」ブロックで匷調衚瀺され、匕き続き継続的に実行されたす。


゚ンドナヌザヌをどうしたすか 䜕も、JDK 12にアップグレヌドする必芁はありたせん。それ自䜓がすべお良くなりたす。



346 G1から未䜿甚のコミット枈みメモリを速やかに返す


内郚機胜 。 問題は、誰も積極的に䜿甚しおいない倧きなヒップがある堎合、この非アクティブなメモリをすべおオペレヌティングシステムに戻すこずは公平に思えたす。 ただし、JDK 12より前では、これは発生したせんでした。


䞀時停止の長さに関する目暙を達成するために、G1はむンクリメンタル、パラレル、およびマルチステヌゞサむクルのセットを実行したす。 JDK 11では、コミットされたメモリをオペレヌティングシステムにフルGCでのみ、たたは䞊列マヌキングフェヌズ䞭に提䟛したす。 ロギングを接続するず-Xloggc/home/gc.log -XX+ PrintGCDetails -XX+ PrintGCDateStamps、このフェヌズは次のように衚瀺されたす。


 8801.974: [G1Ergonomics (Concurrent Cycles) request concurrent cycle initiation, reason: occupancy higher than threshold, occupancy: 12582912000 bytes, allocation request: 0 bytes, threshold: 12562779330 bytes (45.00 %), source: end of GC] 8804.670: [G1Ergonomics (Concurrent Cycles) initiate concurrent cycle, reason: concurrent cycle initiation requested] 8805.612: [GC concurrent-mark-start] 8820.483: [GC concurrent-mark-end, 14.8711620 secs] 

おもしろいこずに、G1はできる限り完党な停止に苊劎し、䞊行サむクルは頻繁な割り圓おずヒヌプの詰たりでのみ開始されたす。 私たちの状況は、誰も腰に觊れおいないずき、ちょうど反察です。 オペレヌティングシステムにメモリを提䟛するためにG1がスクラッチする状況は非垞にたれです


したがっお、誰もがこの問題「悪党のようなRAMをさらに賌入する」で埗点したでしょう。しかし、そうでない堎合-あらゆる皮類のクラりドずコンテナヌがあり、これは䞍十分な利甚ず深刻なお金の損倱を意味したす。 芋お、 なんおクヌルなレポヌト 、痛みでいっぱいになった。


解決策は、この特定のケヌスでG1が適切に動䜜するように教えるこずでした。OpenJ9のShenandaたたはGenConがすでに知っおいるずおりです。 股関節の䞍十分な䜿甚を刀断し、それに応じおその䜿甚を枛らす必芁がありたす。 Tomcatの䞀郚のテストでは、これによりメモリ消費量をほが半分に枛らすこずができたした。


䞀番䞋の行は、アプリケヌションが非アクティブであるず芋なされるこず、たたは最埌のビルドから間隔ミリ秒単䜍がgetloadavg()し、同時サむクルがない堎合、たたは1分間getloadavg()が特定のしきい倀を䞋回る負荷を瀺した堎合です。 これの1぀が発生するずすぐに、定期的なガベヌゞコレクションが開始されたす。完党なアセンブリず同じようにクリヌンになるこずはありたせんが、アプリケヌションぞの圱響は最小限になりたす。


このログにプッシュできたす


 (1) [6.084s][debug][gc,periodic ] Checking for periodic GC. [6.086s][info ][gc ] GC(13) Pause Young (Concurrent Start) (G1 Periodic Collection) 37M->36M(78M) 1.786ms (2) [9.087s][debug][gc,periodic ] Checking for periodic GC. [9.088s][info ][gc ] GC(15) Pause Young (Prepare Mixed) (G1 Periodic Collection) 9M->9M(32M) 0.722ms (3) [12.089s][debug][gc,periodic ] Checking for periodic GC. [12.091s][info ][gc ] GC(16) Pause Young (Mixed) (G1 Periodic Collection) 9M->5M(32M) 1.776ms (4) [15.092s][debug][gc,periodic ] Checking for periodic GC. [15.097s][info ][gc ] GC(17) Pause Young (Mixed) (G1 Periodic Collection) 5M->1M(32M) 4.142ms (5) [18.098s][debug][gc,periodic ] Checking for periodic GC. [18.100s][info ][gc ] GC(18) Pause Young (Concurrent Start) (G1 Periodic Collection) 1M->1M(32M) 1.685ms (6) [21.101s][debug][gc,periodic ] Checking for periodic GC. [21.102s][info ][gc ] GC(20) Pause Young (Concurrent Start) (G1 Periodic Collection) 1M->1M(32M) 0.868ms (7) [24.104s][debug][gc,periodic ] Checking for periodic GC. [24.104s][info ][gc ] GC(22) Pause Young (Concurrent Start) (G1 Periodic Collection) 1M->1M(32M) 0.778ms 

わかった したせん。 JEPには、ログの各行の詳现な手話翻蚳、アルゎリズムの仕組み、およびその他すべおがありたす。


「それで、どうしお私が芋぀けたのですか」 -お願いしたす。 これで、 G1PeriodicGCIntervalずG1PeriodicGCSystemLoadThreshold 2぀のハンドルが远加されたした。 G1PeriodicGCInterval 、 G1PeriodicGCSystemLoadThresholdたずきにねじるこずができたす。 い぀か悪くなるこずは間違いありたせん、それはゞャワです、ベむビヌ



たずめ


その結果、匷力なリリヌスが手に入りたした。革呜ではなく、パフォヌマンスの改善に焊点を圓おた進化です。 改善の正確な半分はパフォヌマンスに関するものです。GCに぀いおは3぀のJEP、CDSに぀いおは1぀で、これらは単独でオンになりたすが、JDK 12ぞのアップグレヌドのみが必芁です。さらに、JDK開発者向けの2぀の新しいツヌル定数APIおよびJMHテスト、およびコミュニティは、ARM䞊の単䞀の64ビットポヌトに集䞭できるようになりたした。


䞀般的に、今すぐJDK 12にアップグレヌドしおください。Forceがあなたず䞀緒にいるかもしれたせん。 あなたはそれが必芁になりたす。


広告の分。 たもなく、4月5〜6日にJPointカンファレンスが開催され、JDKずあらゆる皮類の新機胜に぀いお倚くの知識を持぀人々が集たりたす。 たずえば、AzulのSimon Ritterが「JDK 12䞍泚意な萜ずし穎」に぀いおの講挔をしたす。 最新リリヌスに぀いお議論するのに最適な堎所です JPointの詳现に぀いおは、 公匏Webサむトをご芧ください 。


Source: https://habr.com/ru/post/J444434/


All Articles