Java 12で利甚可胜になる39の新機胜

Habréのすばらしいむンタビュヌから「Simon Ritterは最初からJavaに取り組んでおり、Zing JVM仮想マシンに取り組んでおり、最高のガベヌゞコレクタヌの1぀であるAzulの副テクニカルディレクタヌずしお継続的にこれを行っおいたす。コレクタヌ»

以䞋は、JDK 12の新しい機胜ず、新しいビルドに移行するずきに発生する可胜性があるいく぀かの問題に関する圌の蚘事の翻蚳です。

最新のJavaリリヌス JDK 10 、 JDK 11 のすべおの倉曎点をリストしたいく぀かのブログ投皿を曞きたした。 ここで、JDK 12のダヌクサむドに぀いお説明したす。アプリケヌションをこのバヌゞョンに移怍する堎合に問題を匕き起こす可胜性があるいく぀かの萜ずし穎に焊点を圓おたす。









JDK 12には、これたでのすべおのJavaリリヌスの䞭で最も少ない数の新機胜がありたすJDK 10では109、JDK 11では90をカりントしたした。 これは悪いこずではありたせん-リリヌスサむクルにより、バヌゞョンによっおはより倚くの倉曎が含たれ、䞀郚はより少ない倉曎が含たれたす。







Java、ラむブラリ、JVM、その他のJDK関数など、新しい関数を明確な論理領域に分割したす。







蚀語の倉曎



私および他の倚くの人々がJDK 12で最も泚目すべきず考える機胜は、新しいswitchステヌトメント JEP 325 です。 これは、「プレビュヌ」の機胜ずしお䜿甚される最初の蚀語倉曎でもありたす。 「プレビュヌ」のアむデアは、 JEP 12の䞀郚ずしお2018幎初頭に導入されたした。 これは基本的に、コマンドラむンオプションを䜿甚しお新機胜のベヌタ版を有効にする方法です。 プレビュヌを䜿甚するず、ナヌザヌのフィヌドバックに基づいお倉曎を加えるこずができたす。最悪の堎合、正しく受信されなかった堎合は、関数を完党に削陀したす。 機胜をプレビュヌするための鍵は、それらがJava SE仕様に含たれおいないこずです。 新しいスむッチに぀いおは、Habré に非垞に優れた翻蚳がありたす。

JDK 12では、スむッチは「コンテンツ」を評䟡しお結果を生成する匏になりたした。 これは、䞋䜍互換性に圱響を䞎えないこずをすぐに説明したす。したがっお、スむッチを挔算子ずしお䜿甚するコヌドを倉曎する必芁はありたせん。







JEPの䟋を䜿甚したす。これは単玔で明確なためです。







叀いスむッチ
int numLetters; switch (day) { case MONDAY: case FRIDAY: case SUNDAY: numLetters = 6; break; case TUESDAY: numLetters = 7; break; case THURSDAY: case SATURDAY: numLetters = 8; break; case WEDNESDAY: numLetters = 9; break; default: throw new IllegalStateException("Huh? " + day); }
      
      





ご芧のずおり、曜日を倉数day



名前にマッピングしおから、倀numLetters



割り圓おたす。 switchは挔算子になったので、switchステヌトメントの結果を䜿甚しお割り圓おを1回実行できたす゚ラヌコヌドの可胜性を倧幅に枛らしたす。







 int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; default -> throw new IllegalStateException("Huh? " + day); };
      
      





2぀の構文の倉曎がすぐにわかりたす。 OpenJDK開発者は、カンマ区切りリストず呌ばれるあたり知られおいない構文関数に出くわしたした。 たた、ラムダ匏挔算子->



するず、倀を簡単に返すこずができたす。 本圓にこれが必芁な堎合は、倀を指定しおbreak



を䜿甚できたす。 この機胜には他にもいく぀かの詳现がありたすが、おそらくJEPの方が読みやすいでしょう。







図曞通



ずおも䟿利だず思う倉曎が1぀ありたす。 二次的なものもいく぀かありたす。







ティヌコレクタヌ



Streams APIには、通垞どおり、Collectorsナヌティリティクラスによっお提䟛される新しいコレクタヌがありたす。 新しいコレクタヌは、 teeing()



メ゜ッドを䜿甚しお取埗できたす。 ティヌむングコレクタヌは、2぀のコレクタヌず1぀のバむファンクションずいう3぀の匕数を取りたす。 このコレクタヌの仕事を理解するために、 Habréに関するこの蚘事をお勧めしたす 。

圌がこれを行う方法を理解するために、図を描きたした。







画像

入力ストリヌムからのすべおの倀は、各コレクタヌに枡されたす。 各コレクタヌの結果は匕数ずしおBiFunctionに枡され、最終結果を生成したす。







簡単な䟋は、平均倀の蚈算ですはい、 averagingInt()



ようなコレクタヌが既に存圚するこずは知っおいたすが、これは抂念を理解するのに圹立぀簡単な䟋です。







 /* Assume Collectors is statically imported */ double average = Stream.of(1, 4, 2, 7, 4, 6, 5) .collect(teeing( summingDouble(i -> i), counting(), (sum, n) -> sum / n) );
      
      





最初のコレクタヌは入力ストリヌムの合蚈を蚈算し、2番目のコレクタヌは芁玠の数を蚈算したす。 BiFunctionは、合蚈を芁玠数で陀算しお平均倀を取埗したす。







java.io



InputStream skipNBytes(long n)



-入力ストリヌムInputStreamから正確にnバむトをスキップしお砎棄したす。 nがれロ以䞋の堎合、バむトはスキップされたせん。







java.lang



新しいパッケヌゞjava.lang.constantが登堎したした。これは、䞀定のJVM API JEP 334の䞀郚です。







各Javaクラスファむルには、クラス内のバむトコヌド呜什のオペランドを栌玍する氞続プヌルがありたす。 開発者がクラスをロヌドする際の問題により、クラスファむルを操䜜するこずは困難です。 定数JVM APIは、定数の各圢匏クラス、ロヌド可胜定数、 MethodHandle



、 MethodHandle



定数、 MethodType



定数を蚘述するための蚘号参照型を提䟛したす。







たた、他のいく぀かのクラスにも圱響を䞎えたした。 次のすべおのクラスにdescribeConstable()



メ゜ッドが远加されたした。









むギリス人ずしお、私はそれをかなりおもしろいず思いたす。 Constable、 describeConstable



ずいう甚語は11䞖玀から䜿甚さdescribeConstable



、それが私たちがしばしば譊察官を指す方法です。 たた、18䞖玀の有名な芞術家、ゞョンコンスタブルの名前でもありたす。 これにより、 describeTurner()



メ゜ッドが将来のバヌゞョンに搭茉されるかどうか疑問に思いたす。 明らかに、この堎合、それはConstant Table



略語であり、法務官や颚景画家ずは関係ありたせん。







次のクラスには、 resolveConstantDesc()



メ゜ッドが含たれおいたす。









java.lang.Character



内郚クラスが曎新され、新しいUnicodeブロックが含たれるようになりたした。 私はい぀も人々がナニコヌドに远加するものを芋぀けたいず思っおいたす。ここにいく぀かの䟋を瀺したす









java.lang.Class



arrayType()



は、このClass



によっおコンポヌネントタむプが蚘述されおいる配列のタむプのClass



を返したす。 これはjshell



を䜿甚しお確認できたす。







 jshell> (new String[2]).getClass().getName() $11 ==> "[Ljava.lang.String;" jshell> (new String[2]).getClass().arrayType() $12 ==> class [[Ljava.lang.String; jshell> "foo".getClass().arrayType() $15 ==> class [Ljava.lang.String;
      
      





このメ゜ッドが䜕を意味するのかはよくわかりたせん。なぜなら、このクラスが衚す型にClass



を远加するだけだからです。







componentType()



、 getComponentType()



ず同じです。 質問が始たる-なぜ冗長な方法を远加するのか







descriptorString()



-再び、 getName()



ず同じ結果を返したす。 ただし、 Class



は新しい定数JVM APIに関連付けられたTypeDescriptor



むンタヌフェヌスを実装するTypeDescriptor



なったため、必芁です。







lava.lang.String



indent()



-文字列に䞀連の先行スペヌスを远加したす。 パラメヌタが負の堎合、この数の先行スペヌスは削陀されたす可胜な堎合。







transform()



-指定された関数を文字列に適甚したす。 結果は文字列ではない堎合がありたす。







java.lang.invoke



VarHandle



、コンパクトな説明を返すtoString()



がVarHandle



。







java.net.SecureCacheResponse



およびjava.net.ssl.HttpsConnection



は、接続で䜿甚されるSSLSession



を含むOptional



を返す新しいメ゜ッドgetSSLSession()



ありたす。







java.nio.files



Files



クラスには、2぀のファむルのコンテンツの最初の䞍䞀臎バむトの䜍眮を怜玢しお返す新しいメ゜ッド、 mismatch()



がありたす。䞍䞀臎がない堎合は-1Lです。







java.text



新しいクラスCompactNumberFormat



たす。 これは、コンパクト圢匏で10進数をフォヌマットするNumberFormat



サブクラスです。 コンパクトなフォヌムの䟋1M



代わりに1000000



したがっお、9文字ではなく2文字が必芁です。 NumberFormat



およびjava.text.spi.NumberFormatProvider



が拡匵され、新しいgetCompactNumberInstance()



メ゜ッドが含たれるようになりたした。 たた、LONGずSHORTの2぀の意味を持぀新しい列挙型NumberFormatStyle



もありNumberFormatStyle



。







java.util.concurrent



CompletionStageには、3぀のメ゜ッドを持぀いく぀かのオヌバヌロヌドされたフォヌムが含たれおいたす。









これらのメ゜ッドは、既存のCompletionStage



から新しいCompletionStage



を䜜成する可胜性を拡匵したす。珟圚のCompletionStage



䟋倖で終了する堎合。 詳现に぀いおは、APIドキュメントを確認しおください。







javax.crypto



Cipher



クラスには、 Cipher



倉換、モヌド、およびプロバむダヌを含む文字列を返す新しいtoString()



メ゜ッドがありたす。







javax.naming.ldap.spi



これはJDK 12の新しいパッケヌゞであり、LDAP操䜜䞭のDNSルックアップのプロバむダヌクラスであるLdapDnsProviderResults



ず、LDAP URLのDNSルックアップ結果をカプセル化するLdapDnsProvider



2぀のクラスが含たれおいたす。







スむング



Swingはただ曎新䞭です はい、 filechooser.FileSystemView



新しいgetChooserShortcutPanelFiles()



メ゜ッドがgetChooserShortcutPanelFiles()



。 デフォルトでファむル遞択ショヌトカットバヌに衚瀺する倀を衚すファむルの配列を返したす。







JVMの倉曎



JEP 189シェナンドヌ 䞀時停止時間の短いガベヌゞコレクタヌ



Shenandoahは2014幎にRed Hatによっお発衚された研究プロゞェクトで、JVMでのメモリ管理のための䜎レむテンシアプリケヌション芁件に焊点を圓おおいたす。 その目暙は、20 GBを超えるヒヌプの最倧䌑止時間1..10ミリ秒 したがっお、小芏暡なアプリケヌション向けではありたせん -Shenandoahの開発者の䞀人が答えたように 、これはそうではなく、小さなアプリケヌションで玠晎らしい仕事をしたす。 このコレクタヌは、アプリケヌションスレッドず䞊行しお動䜜するように蚭蚈されおいるため、ほずんどのガベヌゞコレクタヌで発生する問題を回避できたす。







JEP 344混合G1コレクション



この倉曎は、G1コレクタヌが蚭定された遅延目暙に到達したずきのG1コレクタヌの動䜜を改善するこずを目的ずしおいたす。 G1は、ヒヌプスペヌス叀いものず叀いものの䞡方を領域に分割したす。 叀い䞖代では、1回の操䜜でガベヌゞを収集する必芁がないずいう考え方です。 G1がガベヌゞを収集する必芁がある堎合、G1は定矩する領域を遞択したす。 これはコレクションキットず呌ばれたす。 JDK 12より前のセットで䜜業が開始されたずき、すべおの䜜業は基本的にアトミック操䜜ずしお完了しなければなりたせんでした。 問題は、アプリケヌションのヒヌプ領域の䜿甚法の倉曎により、コレクションセットが倧きすぎお収集に時間がかかりすぎお、䞀時停止時間が達成されないこずがあったこずです。







JDK 12では、G1がこの状況を識別した堎合、これがアプリケヌションが新しいオブゞェクトにスペヌスを割り圓お続ける胜力に圱響しない堎合、デヌタ収集を途䞭で䞭断したす。 G1の最終的な効果は、短い䞀時停止時間に達するず改善されたす。







JEP 346G1から未䜿甚の割り圓お枈みメモリをすばやく返す



これはG1のもう1぀のパフォヌマンス向䞊ですが、もう1぀は、JVMがシステムの他の郚分ず察話する方法に関連しおいたす。 明らかに、JVMヒヌプにはメモリが必芁であり、起動時にオペレヌティングシステムの仮想メモリアロケヌタにメモリを芁求したす。 アプリケヌションの起動時に、ヒヌプに必芁なメモリ量が䜎䞋し、割り圓おられたメモリの䞀郚が他のアプリケヌションで䜿甚するためにオペレヌティングシステムに返される堎合がありたす。







G1はすでにこれを行っおいたすが、これを行うこずができるのは2぀の堎所のうちの1぀だけです。 最初に、完党なコレクション䞭に、次に、䞊列サむクルの1぀䞭に。 G1は完党な収集を行わないようにし、メモリ䜿甚量が少ないず、収集サむクルの間にかなりの期間が生じる可胜性がありたす。 これは、G1が固定メモリを長期間保持できるずいう事実に぀ながりたす。







JDK 12では、G1はアプリケヌションがアむドル状態のずきに定期的に継続たたは䞊列ルヌプの実行を詊み、Javaヒヌプの党䜓的な䜿甚状況を刀断したす。 未䜿甚のメモリは、よりタむムリヌで予枬可胜な方法でオペレヌティングシステムに返すこずができたす。







新しいコマンドラむンフラグ-XX:G1PeriodicGCInterval



を䜿甚しお、チェック間のミリ秒数を蚭定できたす。







この機胜により、長時間アむドル状態になっおいるアプリケヌションでJVMメモリをより保守的に䜿甚できたす。







その他の新しいJDK機胜



JEP 230マむクロベンチマヌクキット



Java Microbenchmarking HarnessJMHは、Alexei ShipilevがOracleで働いおいたずきに開発され、Javaアプリケヌションのパフォヌマンステストを開発するための広範なプラットフォヌムを提䟛したす。 Alexeyは、アプリケヌションのパフォヌマンスを分析する際に発生する倚くの単玔なミスりォヌムアップ、䟋倖の回避などを回避するのに圹立぀玠晎らしい仕事をしたした。







これで、JMHをOpenJDKに含めるこずができたす。 JDK自䜓の䜜業ずコヌドの倉曎に興味がある人は誰でも、これを䜿甚しお、倉曎前埌のパフォヌマンスを比范したり、異なるリリヌスのパフォヌマンスを比范したりできたす。 テストを可胜にするために、倚くのテストが含たれおいたす。 JMHの蚭蚈では、新しいテストを必芁な堎所に簡単に远加できたす。







JEP 3402぀ではなく1぀のAarch64ポヌト



OpenJDKにはArm64アヌキテクチャ甚の2぀のポヌトがあり、1぀はOracleによっお提䟛され、もう1぀はRed Hatです。 これは䞍芁であり、OracleはJDKバむナリのArmのサポヌトを停止したため、Red Hatポヌトのみを䜿甚するこずが決定されたした。これはただサポヌトおよび開発されおいたす。







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



デヌタ共有CDSクラスは、以前はOracle JDKの商甚機胜でした。 Oracle JDKずOpenJDKの機胜の違いをすべお排陀するためにJDK 11で最近行われた移行により、OpenJDKに含たれたした。







CDSを䜿甚するには、アプリケヌションの起動時にロヌドされるクラス甚に䜜成されたアヌカむブが必芁です。 64ビットプラットフォヌム甚のJDK 12では、 lib/server



ディレクトリにclasses.jsa



ファむルがありlib/server



。 これは「デフォルトクラス」のCDSアヌカむブです。 JDKモゞュヌルのすべおのパブリッククラスを意味するず思いたす。 開梱しお確認する方法が芋぀かりたせんでした。 CDSはデフォルトで有効になっおいるため、コマンドラむンの-Xshare:auto



オプションず同等であるため、ナヌザヌはCDSからのアプリケヌションの起動時間が改善されたす。







結論



JDK 12は少数の新機胜ずAPIを提䟛したすが、 switch



は開発者にずっお最も興味深いものです。 G1ナヌザヌは、パフォヌマンスの向䞊にきっず感謝したす。







このリリヌスの新しいバヌゞョンでは、すべおのナヌザヌにこのリリヌスでアプリケヌションをテストするこずをお勧めしたす。 挞進的な倉曎を远跡するこずは、長期サポヌトの次のリリヌスに移行するこずにした堎合に驚きを避けるのに圹立ちたす。







Zulu Community Edition甚の無料のJDK 12ビルドがあり、テストに圹立ちたす。 必ず詊しおください。








All Articles