JavaScriptエンジンの設定

JavaScriptコードの実行は、特にいくつかの環境変数によって影響を受ける:

環境変数説明
QV4_JIT_CALL_THRESHOLDJavaScript エンジンにはジャストインタイムコンパイラ (JIT) が含まれています。JIT は頻繁に実行される JavaScript 関数をマシンコードにコンパイルし、高速に実行します。この環境変数は、JITコンパイルの対象となる関数の実行回数を決定します。デフォルト値は3回です。
QV4_FORCE_INTERPRETERこの環境変数を設定すると、すべての関数と式がインタプリタを通して実行されます。関数や式がどれだけ頻繁に呼び出されたとしても、JITが使用されることはありません。関数や式はqmlcachegenや qmlscを使用して事前にコンパイルすることもできますが、実行時に使用されるのは生成されたバイトコードのみです。生成されたC++コードやその結果のマシンコードは無視されます。
QV4_JS_MAX_STACK_SIZEJavaScriptエンジンは、JavaScriptを実行するためのスタックとして特別なメモリー領域を確保する。このスタックはC++スタックとは別のものです。通常、この領域のサイズは4MBです。この環境変数に数値が含まれている場合、JavaScriptエンジンはそれをJavaScriptスタックとして割り当てられるメモリ領域のサイズ(バイト単位)と解釈します。
QV4_GC_MAX_STACK_SIZE通常のJavaScriptスタックに加えて、JavaScriptエンジンはガベージコレクタのためにもう1つのスタックを保持します。ガベージコレクタが同時に過剰な数のオブジェクトを処理する必要がある場合、このスタックはオーバーランする可能性があります。この環境変数に数値が含まれている場合、この環境変数はガベージコレクタ用のスタックとして割り当てられるメモリ領域のバイト単位のサイズとして解釈されます。
QV4_CRASH_ON_STACKOVERFLOW通常JavaScriptエンジンは、過度に再帰的なJavaScriptコードによって引き起こされるC++スタックオーバーフローをキャッチしようとし、致命的でないエラー状態を生成します。JavaScriptのコンパイルとJavaScriptの実行には別々の再帰チェックがあります。JavaScript のコンパイル時のスタックオーバーフローは、コードが深くネストされたオブジェクトや関数を含んでいることを示します。実行時のスタックオーバーフローは、コードが深い再帰的なプログラムになっていることを示します。JavaScriptの各関数呼び出しは、C++とJavaScriptのスタックの両方でスタック空間を消費するため、このチェックは前述のJavaScriptのスタックサイズに間接的にしか関係しません。利用可能なスタック・サイズは多くの要因に依存し、しばしばユーザーによってカスタマイズされる可能性があるため、過剰な再帰をチェックするコードは必然的に保守的なものになります。この環境変数が設定されていると、JavaScript エンジンは JavaScript のコンパイル時や実行時にスタック・オーバーフローをチェックせず、例外を発生させません。その代わり、スタックがオーバーフローすると、プログラムは無効なメモリー・アクセスを試みます。これによってプログラムが終了する可能性が高い。その結果、プログラムはオペレーティング・システムが提供できるスタック領域をすべて使い果たすことになります。

警告: 悪意のあるコードは、この方法で終了を回避し、予期しないメモリー位置にアクセスすることができるかもしれない。

QV4_MAX_CALL_DEPTHJavaScriptの実行時(コンパイル時とは対照的に)のスタックオーバーフローは、呼び出しの深さ(ネストされた関数呼び出しの数)を制御することで防ぐことができます。デフォルトでは、呼び出しの深さがプラットフォームのデフォルトのスタックサイズに調整された最大数を超えた場合、例外が生成されます。環境変数QV4_MAX_CALL_DEPTH に数値が含まれている場合、この数値が最大呼び出し深度として使用される。JavaScriptをコンパイルする際の再帰制限は影響を受けないので注意すること。デフォルトの最大呼び出し深度は、ほとんどのプラットフォームで1234です。QNX では、デフォルトのスタック・サイズがほとんどのプラットフォームよりも小さいため、640 になります。
QV4_MM_AGGRESSIVE_GCこの環境変数を設定すると、各メモリ割り当ての前にガベージ・コレクタが実行されます。これは実行時に非常にコストがかかりますが、例えばC++からQMLエンジンに属するオブジェクトを手動で削除するなど、多くのメモリ管理エラーを素早く発見することができます。
QV4_PROFILE_WRITE_PERF_MAPLinuxでは、perf ユーティリティを使用してプログラムをプロファイルすることができます。JITコンパイルされたJavaScript関数を解析するには、その名前とメモリ上の位置を知る必要がある。この情報を提供するために、perf-<pid>.map という特別なファイルを/tmpに作成し、perf がそれを読み込むという慣例があります。この環境変数が設定されている場合、JIT はこのファイルを生成します。
QV4_SHOW_BYTECODEQt が生成した IR バイトコードをコンソールに出力します。QML_DISABLE_DISK_CACHE と組み合わせないと、すでにキャッシュされているバイトコードは表示されません。
QV4_DUMP_BASIC_BLOCKS先にコンパイルされた各関数の基本ブロックを出力します。ブロックの詳細はコンソールに出力されます。さらに、各ブロックのバイトコードを含む制御フローグラフが、コンパイルされた各関数の DOT フォーマットで生成されます。QV4_DUMP_BASIC_BLOCKS の値は、DOT ファイルを生成するフォルダへのパスとして使用されます。パスが["-", "1", "true"]のいずれかである場合、またはファイルがオープンできない場合、グラフは代わりに標準出力にダンプされる。
QV4_VALIDATE_BASIC_BLOCKS先にコンパイルされた関数の基本ブロックに対してチェックを行い、その構造と一貫性を検証します。検証に失敗した場合、エラーメッセージがコンソールに出力されます。

QML Disk Cacheはさらに環境変数を受け付け、その動作を微調整することができます。特にQML_DISABLE_DISK_CACHE はデバッグに便利です。

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。