Java 15の新機胜は䜕ですか





隠しクラス、封印されたクラス、テキストブロック、レコヌド、およびEdDSAJDK15には倚くの䟡倀がありたす。



私の奜きな衚珟の1぀が蚀うように、Java15には豊富なチョコレヌトの良さがたくさんありたす。新しいバヌゞョン2020幎9月15日リリヌスには、JDKの改善を目的ずした14の重芁な倉曎JEPが含たれおいたす。この蚘事では、JEPに含たれる情報に基づいお、新補品の抂芁を簡単に説明したす。



14JEPは5぀のグルヌプに分けるこずができたす。より詳现な調査に぀いおは、それぞれのドキュメントを参照しおください。



息を呑むような新機胜



  • JEP 339゚ドワヌズカヌブデゞタル眲名アルゎリズムEdDSA
  • JEP 371隠されたクラス


既存のJavaSE暙準機胜ぞの远加



  • JEP 378テキストブロック
  • JEP 377ZGCガベヌゞコレクタヌ
  • JEP 379シェナンドア-䜎ポヌズのガベヌゞコレクタヌ


埓来のJavaSE機胜の改善



  • JEP 373廃止されたDatagramSocketAPIのオヌバヌホヌル


私たちは新補品を楜しみにしおいたす



  • JEP 360封印されたクラスプレビュヌ
  • JEP 375instanceofのパタヌンマッチング2番目のプレビュヌ
  • JEP 384゚ントリヌ第2ドラフト
  • JEP 383倖郚メモリアクセスAPI2番目のむンキュベヌタヌ機胜


サポヌトの削陀ず終了



  • JEP 372: Nashorn JavaScript Engine
  • JEP 374:
  • JEP 381: Solaris SPARC
  • JEP 385: RMI


,



゚ドワヌズカヌブデゞタル眲名アルゎリズムJEP 339。私は、Edwards-Curveデゞタル眲名アルゎリズムEdDSAが私の暗号化の知識を少し超えおいるこずを最初に認めたす。さお、私はそれに぀いお䜕も知りたせん。ただし、このJEPは、プラットフォヌムに䟝存しないEdDSAの実装ずしお蚭蚈されおおり、既存のC実装であるECDSAよりもパフォヌマンスが優れおいたす。



JDKのドキュメントによるず、EdDSAは、JDKの既存のスキヌムに比べおいく぀かの利点がある最新の楕円曲線眲名スキヌムです。



実装目暙

  1. このJEPの䞻な目的は、内暙準ずしお眲名方匏を実珟するこずであるRFC 8032。ただし、新しいスキヌムはECDSAに眮き換わるものではありたせん。
  2. - EdDSA , ECDSA . , EdDSA, Curve25519 ~126 , , ECDSA, secp256r1 ~128 .
  3. , . .


今、あなたは私よりも倚くを知っおいたす。 EdDSAに぀いお説明しおいるJavaMagazineの蚘事をお楜しみに。



非衚瀺クラスJEP 371は、他のクラスのバむトコヌドから盎接呌び出すこずができないクラスです。これらは、実行時にクラスを動的に䜜成し、リフレクションメカニズムを介しお間接的に䜿甚するフレヌムワヌクで䜿甚するこずを目的ずしおいたす。動的に生成されたクラスは限られた時間しか必芁ずされない可胜性があるため、静的に生成されたクラスの存続期間䞭それらを保持するず、メモリフットプリントが䞍必芁に増加する可胜性がありたす。



動的に生成されたクラスも怜出できたせん。そのようなクラスを名前で芋぀けるこずは、静的に生成されたクラスの単なる実装の詳现であるずいう目的を損なうため、有害です。



非衚瀺クラスのリリヌスは、開発者が非暙準API sun.misc.Unsafe :: defineAnonymousClassの䜿甚を停止するための基瀎を築きたす。Oracleは、将来、このクラスを削陀する予定です。



既存のJavaSE暙準ぞの远加



Project Amberからのテキストブロック JEP 378は、 JDK13ず14の2぀の暫定バヌゞョンの埌にようやくリリヌスされたした。それらの䜜成の目的は、Javaで耇数行の文字列リテラルを宣蚀しお䜿甚するこずの難しさを軜枛したいずいう開発者の願望でした。



テキストブロックは、予枬可胜な方法で文字列を自動的にフォヌマットしたすが、それだけでは䞍十分な堎合は、開発者がフォヌマットを匕き継ぐこずができたす。予備機胜の2番目のバヌゞョンでは、新しい行ずスペヌスを凊理するための2぀の新しい゚スケヌプシヌケンスが導入されおいたす。たずえば、\ <line-terminator>は、新しい行の文字の挿入を明瀺的に抑制したす。



以前は、1行の長いテキストを印刷するには、次のように蚘述する必芁がありたした。





\を䜿甚するず、コヌドが読みやすくなりたす。





\ s゚スケヌプシヌケンスは、末尟のスペヌスが削陀されるのを防ぐこずができたす。したがっお、次のテキストは3行を衚しおおり、各行は正確に5文字で構成されおいたす䞭倮の行の緑色に察応し、\ sはすでに5文字含たれおいるため、䜿甚されおいたせん。





ZGCガベヌゞコレクタヌJEP 377は、実隓的な機胜ずしおJDK11で導入されたした。珟圚、正匏なステヌタスを取埗しおいたす。 ZGCは、䞊列のNUMA察応のスケヌラブルなガベヌゞコレクタであり、ガベヌゞコレクションの埅ち時間が短くなりたすマルチテラバむトのヒヌプでも10ミリ秒未満。 Oracleによっおテストされた平均䌑止時間は、1ミリ秒未満であり、最倧は2ミリ秒未満です。図1は、Java䞊列ガベヌゞコレクタヌG1ずZGCを、ZGC䞀時停止時間が10倍に増加した状態で比范しおいたす。



画像


図1.ガベヌゞコレクタの䞀時停止時間の比范



ただし、倚くのワヌクロヌドでは、G1これはただデフォルトですがZGCよりもわずかに速い堎合がありたす。たた、わずか数癟メガバむトのような非垞に小さなヒヌプの堎合、G1も高速になる可胜性がありたす。したがっお、独自の負荷を䜿甚しお独自のテストを実行し、䜿甚するガベヌゞコレクタヌを確認するこずをお勧めしたす。



重芁ZGCは実隓的ではなくなったためOracleOpenJDKビルドおよびOracleJDKに含たれおいたす、-XX+ UnlockExperimentalVMOptionsを䜿甚しおアクティブ化する必芁はありたせん。



シェナンドアJEP 379䞀郚のOpenJDKビルドで䜿甚できるガベヌゞコレクタヌの別のバリアントです。JDK 12以降、実隓的です。珟圚、ZGCず同様に、XX+ UnlockExperimentalVMOptionsは必芁ありたせん。



埓来のJavaSE機胜の最新化



非掚奚のDatagramSocketAPIJEP 373を䜜り盎したした。このJEPは、java.net.DatagramSocketおよびjava.net.MulticastSocket APIの叀い、保守が困難な実装を、保守ずデバッグが容易な、よりシンプルで最新の実装に眮き換えるため、これは基本的に䞀郚のゞュラ玀コヌドのリファクタリングず考えおください。 ProjectLoom仮想ストリヌムを操䜜したす。



叀いAPIJDK 1.0以降を䜿甚するコヌドが倚数あるため、廃止された実装は削陀されたせん。実際、新しいJDK固有のシステムプロパティjdk.net.usePlainDatagramSocketImplは、APIリファクタリングが回垰テストで問題を匕き起こす堎合、たたは堎合によっおは、非掚奚の実装を䜿甚するようにJDKを構成したす。



新補品を楜しみにしおいたす



封印されたクラスJEP 360。 ProjectAmberで䜜成された最初のプレプロダクションバヌゞョン。封印されたクラスずむンタヌフェヌスは、それらの拡匵たたは実装を他のクラスに制限したす。どうしおそれが重芁ですか開発者は、特定のクラスたたはむンタヌフェむスの実装を担圓するコヌドを管理したい堎合がありたす。封印されたクラスは、スヌパヌクラスの䜿甚を制限するためのアクセス修食子よりも宣蚀的な方法を提䟛したす。䟋えば





クラスを封印する目的は、どのサブクラスが蚱可されおいるかをクラむアントコヌドに知らせるこずです。結局のずころ、クラスたたはむンタヌフェむスの元の定矩が完党に網矅的であるず予想され、開発者がそれを制埡䞍胜に拡匵するこずを蚱可しない堎合がありたす-明瀺的に指定されたクラスのみが可胜です。



封印されたクラスにはいく぀かの制限がありたす。

  • 封印されたクラスずその蚱可されたサブクラスは、同じモゞュヌル内にある必芁がありたす。名前のないモゞュヌルで宣蚀されおいる堎合は、同じパッケヌゞに配眮する必芁がありたす
  • 蚱可されるすべおのサブクラスは、封印されたクラスを盎接拡匵する必芁がありたす
  • , , , — final, sealed nonsealed ( )


instanceofのパタヌンマッチングJEP 375。 2番目のプレビュヌは、ProjectAmberからの別の開発です。機胜の最初の暫定バヌゞョンはJava14であり、それに比べお倉曎はありたせん。



目暙は、instanceof挔算子のパタヌンマッチングを通じおJavaを改善するこずです。これにより、プログラム内の䞀般的なロゞック、぀たりオブゞェクトからのコンポヌネントの条件付き抜出をより簡朔か぀安党に衚珟できたす。䟋ずしお、MalGuptaの優れた蚘事「Java14でのinstanceofのパタヌンマッチング」を参照しおみたしょう。



゚ントリヌJEP 384、2番目のドラフト。レコヌドは、䞍倉デヌタの透過的なキャリアずしお機胜するクラスです。新しいJEPには、コミュニティフィヌドバックに基づく説明が含たれおおり、ロヌカルクラスずむンタヌフェむスのいく぀かの新しい远加圢匏がサポヌトされおいたす。゚ントリヌもプロゞェクトアンバヌから来おいたす。



レコヌドは、倀の単玔な集蚈を衚すオブゞェクト指向の構成です。したがっお、プログラマヌが拡匵可胜な動䜜ではなく、䞍倉のデヌタのモデリングに集䞭できるようにしたす。レコヌドは、equalsやaccessorsなどのデヌタ駆動型メ゜ッドを自動的に実装したす。゚ントリは、名目䞊の型指定や移行の互換性など、長幎のJavaの原則も保持したす。぀たり、䞍倉のデヌタを含むクラスのコヌディングず読み取りが容易になりたす。



倖郚メモリアクセスJEP 383は、JavaプログラムがJavaヒヌプの倖郚の倖郚メモリに安党か぀効率的にアクセスできるようにするAPIの2番目のむンキュベヌタヌバヌゞョンです。目暙は、java.nio.ByteBufferずsun.misc.Unsafeの眮き換えを開始するこずです。これは、Javaず他のAPI間の通信を改善するPanamaプロゞェクトの䞀郚です。



JEPは、このむノベヌションの必芁性を次のように適切に説明しおいたす。



倖郚メモリぞのアクセスに関しお、開発者はゞレンマに盎面しおいたす。ByteBufferAPIなど、安党であるが制限されたおそらく効率の䜎いパスを遞択する必芁があるのか​​、それずもセキュリティ保蚌を攟棄し、危険でサポヌトされおいない安党でないAPIを採甚したすか



このJEPは、倖郚メモリにアクセスするための安党で保守が容易で効率的なAPIを導入しおいたす。倖郚メモリアクセスの問題に的を絞った゜リュヌションを提䟛するこずにより、開発者は既存のAPIの制限や危険から解攟されたす。たた、新しいAPIはJITの最適化を念頭に眮いおれロから蚭蚈されおいるため、パフォヌマンスも向䞊したす。



削陀ずサポヌトの終了



これらの決定はどれも物議を醞すものであっおはなりたせん。



Nashorn JavaScript゚ンゞンの削陀JEP 372。この゚ンゞン、そのAPI、およびjjsツヌルはJava11で非掚奚になりたした。さようならを蚀う時が来たした。予玄枈み



ロックの無効化ず削陀JEP 374は、HotSpot JVMで䜿甚されおいた叀い最適化手法を削陀しお、チェックされおいないロックに関連するオヌバヌヘッドを削枛したす。このロックにより、これたで埓来のロック方法に比べおパフォヌマンスが倧幅に向䞊したしたが、過去に芋られたパフォヌマンスの向䞊は、今日ではそれほど明癜ではありたせん。最新のプロセッサでアトミック呜什を実行するコストは䜎䞋したした。



冗長なロックは倚くの耇雑なコヌドをもたらし、この耇雑さにより、Java開発チヌムが同期゚ンゞンに倧幅な倉曎を加えるこずができなくなりたした。ロックを無効にし、再床有効にするのはプログラマヌに任せるこずで、Java開発チヌムは、将来のリリヌスでロックを完党に削陀するのが賢明かどうかを刀断したいず考えおいたす。



SolarisおよびSPARCポヌトの削陀JEP 381。この堎合、SolarisオペレヌティングシステムおよびSPARCアヌキテクチャに固有のすべおの゜ヌスコヌドが削陀されたす。これ以䞊蚀うこずはありたせん。



埌でアンむンストヌルするためにRMIアクティベヌションを陀倖したすJEP 385。 Java 8でオプションであったリモヌトメ゜ッドの呌び出しの廃止された郚分を削陀するこずにより、Javaを簡玠化したす



。RMIアクティベヌションの䜿甚が削枛されたす。 Javaチヌムは、Javaチヌムを䜿甚しお新しいアプリケヌションが䜜成されたずいう蚌拠はなく、RMIアクティベヌションを䜿甚しおいる既存のアプリケヌションはほずんどないずいう蚌拠がありたす。さたざたなオヌプン゜ヌスコヌドベヌスを怜玢したずころ、それに関連するAPIに぀いおはほずんど蚀及されおいたせんでした。倖郚で生成されたRMIアクティベヌション゚ラヌの報告は数幎間ありたせん。



Javaプラットフォヌムの䞀郚ずしおRMIアクティベヌションをサポヌトするには、継続的なメンテナンスコストがかかりたす。これにより、RMIが耇雑になりたす。RMIの残りの郚分に圱響を䞎えるこずなく、RMIのアクティブ化を削陀できたす。これを削陀しおも、Javaの開発者の䟡倀は䜎䞋したせんが、JDKの長期的な保守コストは削枛されたす。



結論



Java 15は6か月のリリヌスサむクルを継続し、ほずんどの開発者に圹立぀䞭芏暡のリリヌスです。



All Articles