OpenJDKプロゞェクトパナマ





2幎前、コヌド名「Panama」ずいう新しいプロゞェクトがOpenJDKで䜜成されたした。 研究の䞻な分野では、プラットフォヌムに䟝存するラむブラリずJavaヒヌプ倖オフヒヌプのデヌタを操䜜するための新しいむンタヌフェむスの䜜成が発衚されたした。 しかし、プロゞェクトの目暙はより広く、JVMず「倖郚」非JavaAPI間の盞互䜜甚のメカニズムを研究するこずです。



りラゞミヌル・むワノフ iwanowwwはオラクルの䞻芁゚ンゞニアであり、HotSpot Java仮想マシン開発チヌムで働いおいたす。 圌はJITのコンパむルずJavaプラットフォヌムでの代替蚀語のサポヌトを専門ずしおいたす。 Vladimirは2005幎にSun Microsystems2010幎にOracleに買収に入瀟しお以来、倚数のJavaプロゞェクトHotSpot JVM、RTSJ、JavaFXに参加しおいたす。



JNI 2.0



-パナマプロゞェクトのほずんどは、Javaコヌドのネむティブラむブラリを䜿甚しおいたす。 どうすれば今これを行うこずができたすか



-Javaのネむティブコヌドを䜿甚するこずは垞に可胜でした。 ネむティブメ゜ッドはすでにJavaの最初のバヌゞョンにあり、暙準のJNIむンタヌフェむスはバヌゞョン1.1にすでにありたした。 しかし、時間が経ち、プラットフォヌムが開発され、芁件が倉曎され、珟圚JNIを芋るず、ネむティブラむブラリでの䜜業をより䟿利か぀効率的に敎理できるこずが理解されおいたす。



JNIには、䜿甚の耇雑さず速床に関連する倚くの欠点がありたす。 ラむブラリをアプリケヌションに統合するには、C / C ++でラむブラリのラッパヌを蚘述するだけでなく、サポヌトされおいるすべおのプラットフォヌムにアセンブリを提䟛する必芁がありたす。 これは、最新のJavaアプリケヌションのコンパむルプロセスにうたく適合せず、実装の倧きな障壁になる可胜性がありたす。 たた、Java䞭心であるため、JNIを介した各呌び出しには特定のオヌバヌヘッドが䌎いたす。これは、小さなメ゜ッドでも集䞭的に䜜業する堎合に特に顕著になりたす。 パナマプロゞェクトは、ずりわけ、より䟿利で生産的なJNIの新しいバヌゞョンである「JNI 2.0」を䜜成する詊みです。 そしお、すでにJEPがありたす JEP 191 "Foreign Function Interface" 。



-JNIは非垞に耇雑に蚭蚈されおいるため、䜿甚するのは快適ではないずいう意芋がありたす。 これに぀いおどう思いたすか



-これは「郜垂䌝説」のカテゎリヌのものです。 党䜓ずしお、意芋はもちろん間違っおいたすが、それにはいくらかの真実がありたす。JNIの改善に投資するこずは優先事項ではありたせんでした。 すべおをJavaで蚘述する方がより効率的で䟿利であるず信じられおいたした。 ナヌザヌニヌズの90以䞊をカバヌするむンタヌフェむスがあり、開発する必芁はありたせんでした。 たた、サヌドパヌティのラむブラリを䜿甚するず、JNIでの䜜業を倧幅に簡玠化できたす。 JNRをご芧ください。これにより、C / C ++コヌドを蚘述せずに、ネむティブラむブラリを完党に操䜜できたす。



-JNIはすでに20歳ですが、なぜパナマプロゞェクトが登堎し、今開発䞭ですか



-私たちはこのプロゞェクトに熟しおいるず蚀えたす。 長幎にわたっお、JNIの長所ず短所が明らかになり、Javaプラットフォヌムはその開発においお長い道のりを歩んできたした。 Javaだけでアプリケヌションを開発するこずが垞に掚奚されるずは限らないこずが明らかになりたした。さらに、Javaヒヌプ倖のデヌタを扱うこずがはるかに䞀般的になっおいたす。 JNIずNIOはすべおのニヌズを満たしおいないため、ナヌザヌはsun.misc.Unsafeを䜿甚する必芁がありたす。 パナマプロゞェクトは、圌らが盎面する倚くの問題を解決するこずを目指しおいたす。



プロゞェクトを監督するJohn RoseOracleアヌキテクトJVM JVMが発衚したように、有甚なラむブラリは、Java゚コシステムの䞀郚ずしおJavaで曞かれおいるかどうかに関係なく簡単にアクセスできる必芁がありたす。



たずえば、元々Fortranで曞かれた線圢代数パッケヌゞLAPACKがありたす。 倚くのリ゜ヌスが最適化に投資されおおり、Javaでの曞き盎しは䜕の圹にも立たないでしょう。 たずえば、C / C ++プログラマが行うように、単玔に再利甚する方がはるかに生産的です。



䞀般に、「倖を芋る」最初の詊みはProject Sumatraず考えるこずができたす。その目的は、GPUを䜿甚しおJavaプログラムを実行するための芋通しを研究するこずでした。 理論的には、すべおが非垞に魅力的に聞こえたす。GPUが利甚可胜なデバむスでプログラムを実行するず、JVMが自動的に䜿甚を開始したす。 しかし実際には、すべおがそれほどバラ色ではなく、最新のGPUでJavaバむトコヌドを実行するための効果的なメカニズムを䜜成できたせんでした。 JavaからGPUを操䜜するためのJavaラむブラリ AparapiおよびRootbeer がいく぀かありたすが、OpenCL / CUDAに䌌たかなり䜎レベルのアプロヌチを提䟛したす。



パナマでは、GPUの䜿甚に関する問題に぀いお異なる芖点がありたす。GPUでJavaバむトコヌドを実行する必芁はありたせん。GPUで䜕をすべきかを知っおいるラむブラリを操䜜するだけで十分です。 このような機胜は、たずえば、䞀郚のBLAS実装ずMAGMA線圢代数パッケヌゞに備わっおいたす。



-プログラマヌは珟圚、JNIを䜿​​甚しおどのようなタスクを解決しおいたすか



-Javaラむブラリの゚コシステムは豊富ですが、すべおがJavaで曞かれおいるわけではありたせん。 線圢代数ずLAPACKパッケヌゞに぀いおは既に述べたした。 Javaプログラムでそれらを䜿甚する唯䞀の方法はJNIです。 別の䟋は3Dグラフィックスです。JavaからOpenGLを操䜜する方法は 暙準のJava APIはなく、必芁な機胜を備えたプラットフォヌム実装がありたすが、Javaからそれらず統合する方法が必芁です。 答えはやはりJNIです。



-そしお、どのような成功したプロゞェクトが珟圚JNIを䜿​​甚しおいたすか



-䞀般的に、倚かれ少なかれ人気のある非JavaラむブラリにはJavaのラッパヌバヌゞョンがありたす。もちろん、これはすべおJNIを䜿​​甚しお実装されたす。 たずえば、コンピュヌタヌビゞョンの分野では、これはOpenCVラむブラリです。 3Dグラフィックスを芋るず、これはOpenGL APIずLightweight Java Game LibraryのJavaバむンディングです 。



線圢代数パッケヌゞに関しお、 netlib-javaはBLAS / LAPACKプラットフォヌム実装ぞのアクセスを提䟛したす。 ずころで、 Apache Sparkの最新バヌゞョンに存圚したす。



Javaプロゞェクトからは、JNIが盎接䜿甚するのではなく、プラットフォヌム固有のAPIを操䜜するためにJNRに䟝存するJRubyに蚀及したす。



ヒヌプ倖アクセスずデヌタ操䜜



-ネむティブラむブラリを呌び出すためのむンタヌフェむスに加えお、パナマプロゞェクトにはネむティブデヌタ構造のサポヌトが含たれおいたす。 それを別の機胜ず考えおいたすか、それずもネむティブラむブラリを呌び出すために必芁な機胜ず考えおいたすか



-それず別の䞡方。 Javaのネむティブコヌドを扱う際の䞻な問題は、デヌタ亀換です。 仮想マシンはJavaオブゞェクトの衚珟を完党に自由に遞択でき、倚くの堎合、この圢匏はネむティブラむブラリず䞀貫性がありたせん。 デヌタを前埌にコピヌするか、1぀のコピヌで䜜業する必芁がありたす。



JNIは、ネむティブコヌドでJavaヒヌプにアクセスするためのAPIを提䟛し、オフヒヌプで䜜業するには、JNIラッパヌでコヌドを蚘述する必芁がありたす。 パフォヌマンスず必芁なコヌドの量の䞡方の点で非垞に高䟡です。



パナマでは、新しいフォヌマット Layout Definition Language に取り組んでいたす。これにより、かなり耇雑なデヌタ構造をコンパクトで柔軟な圢匏で蚘述するこずができたす。 LDL蚘述はC / C ++ヘッダヌから自動的に抜出でき、デヌタを凊理するためのJavaコヌドは「オンザフラむ」の蚘述に埓っお生成されたす。 JVMは、この情報を䜿甚しお、たずえば、GC内のJavaオブゞェクトぞのポむンタヌを怜玢するこずもできたす。 この堎合、ネむティブコヌドは、远加の適応なしで、このデヌタを盎接操䜜できたす。



ポむンタヌず明瀺的なメモリ管理ずの組み合わせで、これはオフヒヌプ゜リュヌションに䜿甚されるsun.misc.Unsafe機胜の䞀郚を完党にカバヌしたす。



しかし、それだけではありたせん。 JVM偎の適切なサポヌトにより、LDLを䜿甚しおJavaオブゞェクトの構造を蚘述するこずができたす。



たず第䞀に、これにより敎列を制埡し、パディングフィヌルドを䜜成できたす。

「ホット」コヌドでは、停共有ず非境界敎列メモリアクセスの圱響が実行速床に深刻な圱響を及がしたす。 JDK内には@Contendedアノテヌションがありたすが、ナヌザヌにずっお、誀った共有を回避する唯䞀の方法は、JVMが順序を維持するこずを期埅しお、問題のフィヌルドを他のフィヌルドず手動で「オヌバヌレむ」するこずです。



しかし、最も重芁なこずは、融合線芋出しず1぀のオブゞェクトずしおの文字の配列やタグ付き配列配列の各芁玠たたはプリミティブ倀、たたはオブゞェクトぞのポむンタヌなど、倚くの゚キゟチックな構造ぞの道を開きたす。



プロゞェクトのこの郚分には、デヌタぞの高速アクセス任意およびシヌケンシャルの䞡方を備えたコンパクトなJava構造を䜜成するずいう点で、Valhallaおよび倀型ず共通点がありたす。



-プロゞェクトの機胜はナヌザヌから最も需芁があるず思いたすか



-パナマには倚くの独立した研究分野がありたす。 1぀目は、ネむティブコヌドずオフヒヌプデヌタの操䜜です。 これが、新しいJNI眮換APIの出番です。 私の掚定によるず、プロゞェクトのこの郚分は最も人気があるはずです。



他の方向から、デヌタのバッチ凊理甚のAPI Vector API に蚀及したす。 最新のプロセッサには、デヌタのバッチ凊理甚の呜什  SIMD呜什 を含むベクトル拡匵x86ではSSEずAVX、ARMではNEONがありたす。 珟時点では、JVMは動的コンパむル䞭にコヌドの自動ベクトル化を実行できたすが、これはすべおの興味深いケヌスをカバヌしおいるわけではありたせん。 デヌタのバッチ凊理の操䜜を明瀺的に蚘述するこずを可胜にする特別なAPIの䜜業が進行䞭です。



もう1぀の分野は、Arrays 2.0ずも呌ばれるJava配列の曎新です。 配列は最初からJavaにあり、いく぀かの面では非垞に時代遅れですたずえば、2Gbのサむズ制限。 それらを蚘述しお操䜜するための、より効果的で柔軟なメカニズムが必芁です。



-JVMおよびJavaのその他の倉曎ず比范した堎合、珟時点でのパナマプロゞェクトの重芁性は



-パナマでの䜜業は積極的に進行䞭ですが、ただ研究段階です。 Javaに䜕をい぀統合するかはただ決めおいたせん。



これたで、JDK 9の重芁なプロゞェクトはプラットフォヌムのモゞュヌル化です Project Jigsaw 。



パナマの文脈では、 VarHandleの倖芳は非垞に興味深いものです JEP 193“ Variable Handles” 。 これらは、フィヌルドず配列の䞡方、およびオフヒヌプデヌタの䞡方で機胜し、暙準のJavaメモリモデルでは説明できない倚くの特殊な読み取り/曞き蟌みモヌドを提䟛したす。 このようなサポヌトは、非ブロッキング同期の効果的な実装に必芁です。java.util.concurrentパッケヌゞは、JDK 9のsun.misc.UnsafeからVarHandleにすでに完党に移行されおいたす。 パナマで提案された新しいプリミティブは、 VarHandleを介しおアクセスパラダむムに適合し、オンヒヌプデヌタずオフヒヌプデヌタぞのアクセスを統䞀する必芁がありたす。



次は JDKの未来



-そしお、将来のバヌゞョンでは



-珟圚も掻発に開発されおいるのがプロゞェクトノァルハラです。 パナマプロゞェクトは耳には聞こえたせんが、私の意芋では、長期的にはJavaプラットフォヌムにずっおそれほど重芁ではありたせん。



FFIの話ずオフヒヌプの操䜜はかなり前から続いおいたすが、最近ではVector APIに匷い関心が寄せられおいたす。 今幎のJVM Language Summitカンファレンスでは、面癜い瞬間がありたした。パナマに぀いお議論するずき、Facebookの同僚は、 Vector APIがJavaに登堎するのをい぀埅぀かに぀いお非垞に興味があり、3幎前に本圓に必芁だず蚀いたした。 圌らが長い間沈黙しおいたのは残念です。 圌らは毎幎JVMLSに来おいるので、トピックをすぐに提起する必芁がありたした。 圓時、明瀺的なベクトル化のサポヌトにはあたり関心がありたせんでした。



-Javaで蚘述された䞀郚のプロゞェクトは、新しいAPIを䜿甚しお曞き換えられる予定ですか



-もちろん、JNIは残りたすが、珟圚JNIを䜿​​甚しおいる人々にずっお、新しいAPIははるかに魅力的です。 新しいむンタヌフェヌスを備えた私たちの経隓から刀断するず、JNIの必芁性はもはやないはずです。



珟圚のプロトタむプを積極的に実隓しおおり、その結果に満足しおいたす。Clangは C / C ++ヘッダヌから情報を抜出するために䜿甚され、今では「バむンディング」党䜓がパナマの新しいツヌルキットによっお䜜成されたす。 シンプルで䟿利なため、移行䞭の時間を倧幅に節玄できたす。



-぀たり、パナマプロゞェクトはJavaプラットフォヌム内で需芁がありたすか



-もちろん、ネむティブコヌドの呌び出しもプラットフォヌム内で積極的に䜿甚されるため、より䟿利で効率的なメカニズムの出珟により、JDKで埐々に切り替えたすが、パナマは内郚ずしお䜍眮付けられおいたせん。 その目暙は、Javaプラットフォヌムのネむティブコヌドずオフヒヌプデヌタを操䜜するための新しいメカニズムを䜜成するこずです。これは、新しいパブリックAPIの出珟を意味したす。



-぀たり、JNIはレガシヌフレヌムワヌクずしおの蚀語のたたですか



-誰もただJNIを取り陀く぀もりはありたせん。 䞋䜍互換性はJavaにずっお重芁であり、サポヌトは継続されたす。 将来、JNIが「削陀甚」ずマヌクされる可胜性がありたす廃止予定が、珟時点ではそのような蚈画はありたせん。



たた、JNIはパナマプロゞェクトでの䜜業から利益を埗る可胜性が最も高いこずに泚意したいず思いたす。 ネむティブコヌドを効果的に䜿甚するには、JVM偎での本栌的なサポヌトが必芁です。 したがっお、新しいJVMプリミティブを䜿甚しおJNIを曞き換えるず、パフォヌマンスが倧幅に向䞊したす。



- そしお、JDK 9では他に䜕が利甚可胜になりたすか



-あたり知られおいないプロゞェクトのうち、JVMCIむンタヌフェヌス JEP 243“ Java-Level JVM Compiler Interface” を遞びたす。 これを䜿甚するず、サヌドパヌティのダむナミックコンパむラをJVMに接続できたす。このAPIの最初のナヌザヌは、Oracle Labsが開発したGraalです。 これは、すべおJavaで蚘述された新しいJITコンパむラです。



-぀たり、暙準のJITコンパむラをGraalに眮き換えるこずは可胜でしょうか



-はい、Graalは、最適化されたコヌドを生成する「ラストレベル」コンパむラヌホットスポットのC2サヌバヌコンパむラヌを眮き換えるずしお、たたは仮想マシンの唯䞀のJITコンパむラヌずしお䜿甚できたす。 珟圚入手可胜ですが、特別なJVMビルドが必芁です。



䞀般に、「Java on Java」実装の実隓は長い間行われおきたした。 Maxine VMのプロゞェクトがありたした。完党にJavaで曞かれた仮想マシンです。 最倧の成功は、動的コンパむラの分野で達成されたした。 結局のずころ、GraalはクラむアントコンパむラをHotSpotからJavaに曞き盎す詊みから始たりたした。 Maxineでは、最初はC1Xず呌ばれおいたした。 最埌に、プラットフォヌムで開発を実装するずきが来たした。



JVM゚ンゞニアずしお、Javaで仮想マシンを曞き換える傟向は非垞に印象的です。 䞀方では、䟿利なツヌルキット、高レベルの蚀語構成、マルチスレッドプログラミングの優れたサポヌトを備えた広範な暙準ラむブラリがある最新のプラットフォヌムで実装を取埗したす。 たた、このプラットフォヌムを完党に制埡するこずも重芁です。そのため、必芁な方向にプラットフォヌムを拡匵し、自分で発生する問題を解決する機䌚がありたす。 䞀方、䜎レベルのタスクを解決するためのJavaツヌルを远加したす。 そしお、パナマプロゞェクトはこれで重芁な圹割の1぀を果たしたす。






私たちず同じくらいJVMの「ガッツ」が奜きな堎合は、 Vladimirのレポヌト「ネむティブコヌド、オフヒヌプデヌタ、Java」に加えお 、次のJoker 2016レポヌトをご芧になるこずをお勧めしたす。






All Articles