Orinoco: 若い世代のガベージコレクション
V8でのJavaScriptオブジェクトは、V8のガベージコレクタによって管理されているヒープ上に割り当てられます。以前のブログ記事では、ガベージコレクションの停止時間を短縮する方法(複数回)やメモリ消費量を削減する方法について既に説明しました。本記事では、Orinocoの最新機能の1つである並列スカベンジャーを紹介し、V8のガベージコレクタの設計決定や、進行途中で実装した代替アプローチについて議論します。
V8でのJavaScriptオブジェクトは、V8のガベージコレクタによって管理されているヒープ上に割り当てられます。以前のブログ記事では、ガベージコレクションの停止時間を短縮する方法(複数回)やメモリ消費量を削減する方法について既に説明しました。本記事では、Orinocoの最新機能の1つである並列スカベンジャーを紹介し、V8のガベージコレクタの設計決定や、進行途中で実装した代替アプローチについて議論します。
JavaScriptのパフォーマンスは常にV8チームにとって重要な課題であり、この投稿では最近使用している新しいJavaScriptWeb Tooling Benchmarkについて説明し、V8のパフォーマンスボトルネックを特定および修正する方法を共有します。既にご存じの方もいるかもしれませんが、V8はNode.jsに対する強いコミットメントを持っており、このベンチマークは特にNode.jsに基づいて構築された一般的な開発者ツールを使ったパフォーマンステストを実施することでそのコミットメントを拡張しています。Web Tooling Benchmarkに含まれるツールは、現代的なウェブサイトやクラウドベースのアプリケーションを構築するために、開発者やデザイナーが現在使用しているものと同じです。実際のパフォーマンスに焦点を合わせる現在進行中の取り組みを継続するために、開発者が毎日実際に使用するコードを基にベンチマークを作成しました。
6週間ごとに、私たちのリリースプロセスの一環としてV8の新しいブランチを作成します。各バージョンはChrome Betaマイルストーンの直前にV8のGitマスターから分岐されます。本日、私たちは最新のブランチV8バージョン6.3を発表できることを嬉しく思います。このブランチは、数週間後にChrome 63の安定版と連携してリリースされるまでベータ版です。V8 v6.3は、開発者向けの素晴らしい改善が詰まっています。この投稿では、リリースに向けたハイライトのいくつかを予告します。
プロキシは、ES2015以来JavaScriptの重要な部分を形成しています。これらはオブジェクトの基本操作をインターセプトし、その挙動をカスタマイズすることを可能にします。プロキシは、jsdomやComlink RPCライブラリのようなプロジェクトのコア部分を形成しています。最近、V8でプロキシのパフォーマンスを向上させるために多くの努力を行いました。この記事では、V8の一般的なパフォーマンス改善パターンについて、特にプロキシに関する内容を解説します。
約3か月前、私はインターンとしてV8チーム(Googleミュンヘン)に参加し、それ以来VMの_Deoptimizer_に取り組んできました。このプロジェクトは完全に新しいものであり、興味深く挑戦的なものでした。インターンシップの最初の部分ではVMのセキュリティ面の改善に焦点を当てました。そして2つ目の部分ではパフォーマンス改善、具体的には非最適化された関数の解除に使われるデータ構造の削除に取り組みました。このデータ構造はガベージコレクション中にパフォーマンスボトルネックとなっていました。このブログ投稿ではこのインターンシップの2番目の部分について説明します。V8が以前どのように非最適化された関数を解除していたか、どのように変更したか、そしてどのようなパフォーマンス改善が得られたかを説明します。
JavaScriptでは、割り当てられたオブジェクトが現在の関数外でアクセス可能になる場合、オブジェクトが「逃避」したとみなされます。通常、V8は新しいオブジェクトをJavaScriptヒープに割り当てますが、_逃避解析_を使用すると、最適化コンパイラがオブジェクトの寿命が関数のアクティベーションに限定されていることを確証できる場合に、そのオブジェクトを特別に扱えることがわかります。新しく割り当てられたオブジェクトへの参照がそれを生成する関数から逃避しない場合、JavaScriptエンジンはそのオブジェクトをヒープに明示的に割り当てる必要がありません。代わりに、オブジェクトの値を関数のローカル変数として効果的に扱うことができます。それによって、スタックやレジスタにこれらの値を格納したり、場合によっては値を完全に最適化して無くしたりするなどの多種多様な最適化が可能になります。逃避するオブジェクト(正確には逃避しないことを証明できないオブジェクト)は、ヒープに割り当てる必要があります。
注: 記事を読むよりプレゼンを見る方が好みの方には、以下の動画をぜひお楽しみください!
JavaScriptのオブジェクトは、任意のプロパティを関連付けることができます。オブジェクトプロパティ名には任意の文字が含まれることが可能です。JavaScriptエンジンが最適化を選択する興味深いケースの1つが、名前が純粋に数値であるプロパティ、特に配列インデックスです。
6週間ごとに、新しいブランチを作成するのが私たちのリリースプロセスの一環です。各バージョンは、Chrome Beta マイルストーンの直前に V8 の Git マスターからブランチ化されます。本日、最新ブランチである V8 バージョン 6.2 を発表できることを嬉しく思います。このバージョンは数週間後に Chrome 62 ステーブルと共にリリースされるまでベータ版です。V8 v6.2 は、開発者向けのさまざまな興味深い機能を備えています。この投稿では、リリースを見越していくつかのハイライトを紹介します。
この記事では、V8が内部的にJavaScriptプロパティをどのように扱うかを説明したいと思います。JavaScriptの観点からは、プロパティに必要な区別はわずかです。JavaScriptオブジェクトは主に辞書のように振る舞い、キーは文字列であり、値には任意のオブジェクトを使用できます。ただし仕様では、整数インデックス付きのプロパティとその他のプロパティを反復中に異なる扱いをしています。それ以外では、異なるプロパティは、整数インデックス付きであるかどうかに関係なくほぼ同じ動作をします。