Graal実生掻での新しいJVM JVMコンパむラの䜿甚方法

ノボシビルスクで開催されたメむンのシベリアJava䌚議JBreak-2018で 、 Twitterのクリスチャン・タリンゞャヌがGraalの䜿甚に関する実際の経隓を共有したした。 䌚瀟Peter-Serviceはワヌキンググルヌプ党䜓を䌚議に送り、党䜓ずしおこのレポヌトを聞くようになりたした。 圓然のこずながら、Graalはただ倧胆で朜圚的に危険な実隓であるず考えられおいたすただし、JDK 10に入る可胜性は非垞に高いです。 この斬新さが戊闘で珟れるこずを知るこずは非垞に興味深いこずでした-そしおどこでもではなく、そのようなレベルの発展においお。







Christian Talingerは、10幎以䞊にわたっおJava仮想マシンを扱っおきたした。圌の専門知識の重芁なスキルは、JITコンパむラヌだけです。 Graalを玹介し、Twitterのプロダクション環境で珟圚のかなり掻発なChrisによる䜿甚を開始したのはクリスチャンでした。 そしお、タリンゞャヌによるず、この革新は鉄資源を節玄するこずで䌚瀟にかなりの金額を節玄したす。



JBreak䞻催者ずのこのむンタビュヌでは、Christianが基本を明快に説明しおいたす。Graalずは䜕か、それを管理する方法です。 しかし、ノボシビルスクのレポヌトはより実践志向でした。その䞻なタスクは、芳客にGraalずの䜜業を簡単か぀無痛に開始する方法ず、それをやる䟡倀がある理由を瀺すこずでした。



そもそも-結局のずころ、いく぀かの理論的な玹介。 それでは、JITゞャストむンタむムコンパむラずは䜕ですか Javaプログラムを実行するには、いく぀かの手順を実行する必芁がありたす。たず、JVMの呜什で゜ヌスコヌド-バむトコヌドをコンパむルし、次にこのバむトコヌドをJVMで実行したす。 ここで、JVMはむンタヌプリタヌずしお機胜したす。 JITコンパむラは、Javaアプリケヌションの䜜業を高速化するために䜜成されたした。プログラム実行のプロセスでバむトコヌドを䜎レベルのマシン呜什に倉換するこずにより、起動するバむトコヌドの最適化に取り組んでいたす。



HotSpot / OpenJDKは、C ++で実装された2レベルのJITコンパむルを䜿甚したす。 これらはC1およびC2クラむアントおよびサヌバヌずも呌ばれたすです。 デフォルトでは、これらは連携しお動䜜したす。最初に、C1を䜿甚しお衚面的で迅速な最適化が実行され、次にC2を䜿甚しお最もホットなメ゜ッドがさらに最適化されたす。



Java 9では、 JEP-243はJavaコンパむラをJVMに埋め蟌むためのメカニズムを実装したした。 そしお、これは動的コンパむラヌ-JVMCIJava Virtual Machine Compiler Interfaceです。 実際、このメカニズムはGraalをサポヌトしおいたす。 Java 9 Graalは、 JEP-295 -JVMでのAOTコンパむルAhead-of-timeの䞀郚ずしおすでに利甚可胜であったこずを蚀わなければなりたせん。 確かに、AOTコンパむルメカニズムはGraalをコンパむラずしお䜿甚したすが、このJEPでは、JDKぞのGraalコヌドの最初の統合はLinux / x64プラットフォヌム内でのみ想定されおいるず述べおいたす。



したがっお、Graalを詊すには、ADKずJMVCIでJDKを䜿甚する必芁がありたす。 さらに、MacOSたたはWindowsプラットフォヌムで実行する必芁がある堎合は、Java 10のリリヌスを埅぀必芁がありたす察応するチケットではJDK-8172670修正バヌゞョンがトップ10に入れられたす。







ここで、Christianは、珟圚のJDKディストリビュヌションではGraalのバヌゞョンが控えめに蚀っおも時代遅れであるずいう事実1幎前たたはそれより若いにリスナヌの泚意を向けたした。 しかしここでは、Java 9のモゞュヌル性が圹立ちたす。おかげで、Graal゜ヌスから最新バヌゞョンを収集し、コマンド--upgrade-module-pathを䜿甚しおJVMに埋め蟌むこずができたす。 Graalの開発はモゞュヌルシステムよりもずっず前に開始されたため、特別なツヌルを䜿甚しおそれを構築したす。mxは、モゞュヌルJavaシステムをある皋床繰り返したす。 このツヌルはPython 2.7で実行され、すべおのリンクはGitHubのGraalリポゞトリにありたす 。

぀たり、たずmxをデフレヌトしおむンストヌルし、次にGraalをデフレヌトし、mxを介しおモゞュヌルにアセンブルしたす。これにより、JDKの元のモゞュヌルが眮き換えられたす。



䞀芋、これらの操䜜は耇雑で時間がかかるように芋えるかもしれたせんが、実際にはこの特性はそれほどひどいものではありたせん。 そしお、原則ずしお、JDKたたは新しいJDKでパッチがリリヌスされるのを埅たずにGraalバヌゞョンを眮き換える機胜は、個人的には䟿利なようです。 少なくずもクリスチャンは、圌自身がクラりドのマシンでこれらすべおをラむブで収集する方法を瀺したした。 True、Truffleのアセンブル䞭に゚ラヌが発生したした-マシンにいく぀かの远加の䟝存関係をむンストヌルする必芁がありたした。 しかし、Graalは正しく組み立おられお、この圢匏で䜿甚されたしたここから、Truffleに぀いお完党に忘れるこずができるず結論付けられたすGraalは完党に独立しおいたす。



次にJVMがGraalの䜿甚を開始するには、さらに3぀のフラグを蚭定する必芁がありたす。



-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler -XX:-EnableJVMCI
      
      





Graalは基本的に通垞のJavaアプリケヌションであるため、䜜業甚にコンパむルしお準備する必芁がありたすいわゆるブヌトストラップ。 「オンデマンド」モヌドでは、これはアプリケヌションの起動ず䞊行しお発生したす。この堎合、GraalはC1を䜿甚しおコヌドを最適化したす。



アプリケヌションを開始する前に明瀺的に初期化を開始するオプションもありたす。このシナリオでは、Graalに自身を最適化するように指瀺するこずもできたす。 ただし、これには通垞、はるかに時間がかかり、倧きな利点はありたせん。 grailはC1 / C2より少し長く初期化され、より倚くのクラスをコンパむルする必芁があるため、より積極的に空きプロセッサパワヌを䜿甚したす。 しかし、これらの違いはそれほど倧きくなく、実質的に平準化され、アプリケヌションの初期化䞭に䞀般的なノむズで倱われたす。

さらに、GraalはJavaで蚘述されおいるため、ヒヌプを䜿甚しお初期化したすC1 / C2の堎合、mallocを介しおのみメモリも䜿甚されたす。 メむンメモリの消費量は、アプリケヌションの開始時です。 GraalずC1 / C2は䞡方ずも、コンパむル時に無料のカヌネルを䜿甚したす。 Grailのメモリ消費は、GCログを有効にするこずで監芖できたす珟圚、アプリケヌションのメむンヒップからGraalを初期化するヒップの分離はありたせん。



さお、私たちはそれをすべお蚭定する方法を孊びたした-今こそその理由を理解する時です。 Graalを䜿甚する利点は䜕ですか



クリスチャンは実甚的な䟋を䜿甚しおこの質問に答えたした。 圌はScalaで曞かれた1぀のプロゞェクトからいく぀かのベンチマヌクを開始したした。1぀はCPUを積極的に䜿甚しおおり、もう1぀はより積極的にメモリを操䜜しおいたした。 CPUで動䜜するベンチマヌクでは、Graalを䜿甚しおいるず、開始時間が長くなったために平均しお1秒間顕著な䜎䞋が芋られたしたベンチマヌク自䜓が完了するたでに5秒かかりたした。 しかし、2番目のベンチマヌクでは、Graalは非垞に良い結果を瀺したした-C1 / C2の〜28に察しお〜20秒。 そしお、これは、Christianが指摘したように、Scala Graalを䜿甚した䟋はScalaによっお生成されたバむトコヌドの動的構造のためうたく機胜しおいたせん。 ぀たり、玔粋なJavaアプリケヌションの堎合、すべおがさらに改善されるこずを期埅できたす。



さらに、GCログを衚瀺するずき、Graalを䜿甚するず、アプリケヌションが生成するガベヌゞコレクションがはるかに少ない玄2倍こずは明らかでした。 これは、ヒヌプ䞊に䜜成されるオブゞェクトの数を最適化できる、より効率的な゚スケヌプ分析によるものです。







私が聞いたこずに察する個人的な印象を芁玄するず、このレポヌトは私にずっお非垞に包括的なものであり、「緊急にGraalに行く」ずいう粟神で広告メッセヌゞを䞀切䌝えなかったず蚀えたす。 魔法の薬がなく、すべおが垞に実際のアプリケヌションによっお決定されるこずは明らかです。クリスチャン自身は、特定の倀はもちろん特定のベンチマヌクに䟝存するこずを認めおいたす。 いずれにせよ、Grailを詊すこずにした人は、科孊的な突く方法を䜿甚し、実行しおおそらくバグを芋぀ける必芁がありたすさらに線集しおからGraalリポゞトリのプルリク゚ストに蚘入する方が良いでしょう。



しかし、党䜓的に、マむクロサヌビスずステヌトレスアプリケヌションの䜿甚に向かう珟圚の傟向、そしおその結果、Young Genのよりアクティブなそしお正しいアプリケヌションに向かう傟向により、Graalは非垞に良さそうです。



そのため、プロゞェクトをわずかな血でJava 9に翻蚳できるたたはれロから䜜成する堎合は、間違いなくGraalを詊しおみたす。 そしお、䟋えば、レポヌトの重点が特にJITコンパむラヌずしおのGraalに重点を眮いおいるこずさえ嬉しかったです。䞀般に、普通のJava開発者はそれをその品質で぀たり、Truffelなどなしで必芁ずするからですGraalVM。Oracleが最近、JVMに基づいたさたざたな蚀語の開発およびランタむム甚のフレヌムワヌクに統合したした。 メモリコストをテストし、暙準のC1 / C2ずGraalの違いがどれほど顕著かを確認するのは興味深いでしょう。 䞀方、最近ではかなりの量のメモリがアプリケヌションに割り圓おられおおり、その䞻な量は起動時に消費されたすが今日は通垞、アプリケヌション自䜓を既に起動しおいるのは通垞コンテナの初期化ず開始です、これらの数倀は明らかに、いずれの堎合でもそれほど重芁ではありたせん。



ここから、レポヌトからプレれンテヌションをダりンロヌドできたす。



実のずころ、私は個人的に非垞に興味を持ったので、Christianが行ったすべおのステップを繰り返す぀もりですが、Javaベンチマヌクスむヌトを盎接実行しようずしたすたずえば、DaCapoずSPECjvm2008-私はJavaベンチマヌクがあたり埗意ではないので、感謝したす誰かがコメントたたは銬力でより適切なオプションを提案したす。 さお、䜜業の詳现に近い-単玔なWebアプリケヌションたずえば、SpringBoot + Jetty + PostgreSQLをスケッチし、負荷がかかった状態でドラむブしお、数倀を比范しおみたす。 結果をコミュニティず共有するこずを玄束したす。



All Articles