メインコンテンツまでスキップ

「memory」タグの記事が8件件あります

全てのタグを見る

V8ヒープスナップショットの高速化

· 約14分
Jose Dapena Paz

このブログ投稿はJosé Dapena Paz (Igalia) によって執筆され、Jason Williams (Bloomberg)、Ashley Claymore (Bloomberg)、Rob Palmer (Bloomberg)、Joyee Cheung (Igalia)、およびShu-yu Guo (Google) の貢献を受けています。

この投稿では、V8ヒープスナップショットに関して、Bloombergのエンジニアが発見したいくつかのパフォーマンスの問題と、それを解決してJavaScriptメモリ分析をこれまで以上に高速化する方法について話します。

問題

Bloombergのエンジニアは、JavaScriptアプリケーションのメモリリークを診断する作業を行っていました。アプリはOut-Of-Memoryエラーで失敗していました。テストされたアプリケーションでは、V8ヒープの上限が約1400 MBに設定されていました。通常、V8のガベージコレクターはヒープ使用量をその制限内に保つことができるはずであるため、この失敗はリークがある可能性を示していました。

Oilpanにおけるポインタ圧縮

· 約18分
Anton Bikineev および Michael Lippautz ([@mlippautz](https://twitter.com/mlippautz))、ウォーキング逆アセンブラ

4ギガバイト未満のRAMを使用するプログラムをコンパイルする場合に、64ビットのポインタを使用するのは全くもって愚かなことです。このようなポインタの値が構造体内に現れると、メモリの半分を無駄にするだけでなく、キャッシュの半分を効果的に捨てることになります。

Donald Knuth (2008)

Oilpanライブラリ

· 約8分
Anton Bikineev、Omer Katz([@omerktz](https://twitter.com/omerktz))、Michael Lippautz([@mlippautz](https://twitter.com/mlippautz))効率的で効果的なファイル移動者たち

この投稿のタイトルから、オイルパンに関する書籍のコレクションを深掘りするのかと思うかもしれませんが、今回は違います。その代わりに、V8 v9.4以降ライブラリとしてホストされているC++ガベージコレクターであるOilpanについて詳しく見ていきます。

C++用の高性能ガベージコレクション

· 約14分
Anton Bikineev、Omer Katz([@omerktz](https://twitter.com/omerktz))、およびMichael Lippautz([@mlippautz](https://twitter.com/mlippautz))、C++メモリウィスパラー

これまでに、JavaScript用ガベージコレクション、ドキュメントオブジェクトモデル(DOM)、およびこれらすべてがV8でどのように実装および最適化されているかについて何度か 記述して きました。しかし、ChromiumのすべてがJavaScriptというわけではありません。というのも、V8が組み込まれているブラウザおよびそのBlinkレンダリングエンジンのほとんどがC++で記述されているからです。JavaScriptはレンダリングパイプラインによって処理されるDOMとのインタラクションに使用できます。

V8の並行マーク

· 約17分
Ulan Degenbaev、Michael Lippautz、Hannes Payer — メインスレッドの解放者

この投稿では、並行マーク と呼ばれるガベージコレクション技術について説明します。この最適化により、ガベージコレクターがヒープをスキャンして生存オブジェクトを発見・マークしている間もJavaScriptアプリケーションの実行が続けられます。我々のベンチマークでは、並行マークによりメインスレッドのマーキング時間が60%~70%短縮されることが示されています。並行マークは、Orinocoプロジェクト という、古いガベージコレクターを新しい主に並行かつ並列のガベージコレクターに徐々に置き換えるプロジェクトの最後の欠片です。Chrome 64およびNode.js v10では並行マークがデフォルトで有効になっています。

JavaScriptからDOMへ、そして再び戻るまでのトレース

· 約6分
ウラン・デゲンバエフ、アレクセイ・フィリポフ、マイケル・リッパウツ、ハンネス・ペイヤー — DOMの仲間

Chrome 66では、メモリリークのデバッグが格段に簡単になりました。ChromeのDevToolsは、JavaScriptから参照可能なすべてのC++ DOMオブジェクトをトレースおよびスナップショットを取得して、その参照とともに表示することができます。この機能は、V8ガベージコレクタの新しいC++トレースメカニズムの恩恵の一つです。

Chromeの小さな一歩、V8の巨大な飛躍

· 約3分
ヒープの守護者 Ulan Degenbaev、Hannes Payer、Michael Lippautz、そしてDevToolsの戦士 Alexey Kozyatinskiy

V8にはヒープサイズに関するハードリミットがあります。これはメモリリークがあるアプリケーションに対する安全対策として機能します。アプリケーションがこのハードリミットに達すると、V8は緊急措置として一連のガベージコレクションを実行します。ガベージコレクションがメモリを解放するのに役立たない場合、V8は実行を停止し、メモリ不足のエラーを報告します。ハードリミットがなければ、メモリリークがあるアプリケーションがシステムのメモリをすべて使い果たし、他のアプリケーションのパフォーマンスに悪影響を与える可能性があります。

ジャンク・バスターズ パート2: オリノコ

· 約8分
ジャンク・バスターズ: ウラン・デゲンバイエフ、ミハエル・リップアウツ、ハンネス・ペイヤー

以前のブログ記事では、ガベージコレクションがスムーズなブラウジング体験を妨げるジャンクの問題について紹介しました。本記事では、「オリノコ」というコードネームで呼ばれるV8の新しいガベージコレクタの基盤となる3つの最適化を紹介します。オリノコは、厳密な世代境界を持たない主に並列かつ同時的なガベージコレクタを実装することで、ガベージコレクションによるジャンクとメモリ消費を削減しつつ高いスループットを提供することを目指しています。オリノコを別個のガベージコレクタとして旗印の背後に実装するのではなく、V8の最新バージョンにオリノコの機能を段階的に搭載することで、ユーザーにすぐに恩恵をもたらすことにしました。この記事で紹介する3つの機能は、並列圧縮、並列リメンバードセット処理、およびブラックアロケーションです。