JavaScript エンジンの設定

JavaScript コードの実行には、いくつかの環境変数が影響を与える可能性があります。特に以下の変数です:

環境変数説明
QV4_JIT_CALL_THRESHOLDJavaScript エンジンには、ジャストインタイム(JIT)コンパイラが組み込まれています。JIT は、頻繁に実行される JavaScript 関数を機械語にコンパイルし、実行速度を向上させます。この環境変数は、関数が JIT コンパイルの対象となるために必要な実行回数を決定します。デフォルト値は 3 回です。
QV4_FORCE_INTERPRETERこの環境変数を設定すると、すべての関数および式がインタプリタを通じて実行されます。関数や式が何度呼び出されても、JITは一切使用されません。 関数や式は、qmlcachegenやqmlsc を使用して事前にコンパイルされる場合がありますが、実行時には生成されたバイトコードのみが使用されます。生成された C++ コードおよびそこから生成されたマシンコードは無視されます。
QV4_FAIL_ON_INVALID_AOTC++ にコンパイルされた QML コードは、実行時に検証されます。この検証に失敗した場合、デフォルトでは、コードはネイティブコードとして実行されるのではなく、インタプリタによって実行されます。この環境変数を設定すると、検証の失敗によりプログラムが終了します。これは、ネイティブコードとして実行可能なすべてのコードが確実にネイティブコードとして実行されるようにするために役立ちます。
QV4_SKIP_AOT_VALIDATIONこの環境変数を設定すると、コンパイルされた QML コード用に生成された C++ コードのランタイム検証がスキップされます。これにより、検証処理自体のオーバーヘッドを回避できます。なお、これは検証をスキップするのみであり、qmlcachegen による検証コード自体の生成を阻止するものではありません。検証コードの生成を阻止するには、qt_add_qml_module の `NO_GENERATE_AOT_VALIDATION ` オプションを使用してください。
QV4_JS_MAX_STACK_SIZEJavaScriptエンジンは、JavaScriptを実行するためのスタックとして特別なメモリ領域を確保します。このスタックはC++のスタックとは別個のものです。通常、この領域のサイズは4MBです。この環境変数に数値が指定されている場合、JavaScriptエンジンはそれを、JavaScriptスタックとして割り当てるメモリ領域のサイズ(バイト単位)として解釈します。
QV4_GC_MAX_STACK_SIZE通常の JavaScript スタックに加えて、JavaScript エンジンはガベージコレクタ用に別のスタック(通常は 2MB のメモリ)を保持しています。 ガベージコレクタが同時に処理すべきオブジェクトの数が過剰になると、このスタックがオーバーフローする可能性があります。数値が指定されている場合、この環境変数は、ガベージコレクタのスタックとして割り当てられるメモリ領域のサイズ(バイト単位)として解釈されます。
QV4_STACK_SOFT_LIMITこの環境変数が設定されている場合、コールスタックの使用量が定義されたソフトリミットに達すると、JavaScript エンジンは「RangeError: Maximum call stack size exceeded」という例外をスローします。この変数が設定されていない場合、エンジンは OS に応じて、実行時に検出されたリミットまたは Qt で事前定義されたリミットをデフォルトとして使用します。
QV4_CRASH_ON_STACKOVERFLOW通常、JavaScript エンジンは、過度に再帰的な JavaScript コードによって引き起こされる C++ スタックオーバーフローを検出し、致命的ではないエラー状態を生成しようとします。 JavaScript のコンパイル時と実行時では、それぞれ別個の再帰チェックが行われます。JavaScript のコンパイル時にスタックオーバーフローが発生する場合は、コードに深くネストされたオブジェクトや関数が含まれていることを示しています。実行時にスタックオーバーフローが発生する場合は、コードが深く再帰的なプログラムになっていることを示しています。 このチェックは、前述の JavaScript スタックサイズとは間接的にしか関係していません。これは、各 JavaScript 関数呼び出しが、C++ スタックと JavaScript スタックの両方でスタック領域を消費するためです。利用可能なスタックサイズは多くの要因に依存し、多くの場合ユーザーによってカスタマイズ可能であるため、過度な再帰をチェックするコードは必然的に保守的な仕様となっています。 この環境変数が設定されている場合、JavaScriptエンジンはJavaScriptのコンパイル時や実行時にスタックオーバーフローをチェックせず、それに対する例外も発生させません。その代わりに、スタックがオーバーフローすると、プログラムは無効なメモリアクセスを試みます。これにより、プログラムはほぼ確実に終了します。その結果、プログラムはオペレーティングシステムが提供できるすべてのスタック領域を使い切ることになります。

警告:悪意のある コードは、この方法によってプログラムの終了を回避し、予期しないメモリ位置にアクセスできる可能性があります。

QV4_MAX_CALL_DEPTHJavaScriptの実行時(コンパイル時とは対照的に)のスタックオーバーフローは、呼び出し深度(ネストされた関数呼び出しの数)を制御することで防止されます。デフォルトでは、呼び出し深度がプラットフォームのデフォルトのスタックサイズに合わせて調整された最大値を超えると、例外が発生します。QV4_MAX_CALL_DEPTH 環境変数に数値が指定されている場合、その数値が最大呼び出し深度として使用されます。 ただし、JavaScriptのコンパイル時の再帰制限には影響しない点に注意してください。ほとんどのプラットフォームで、デフォルトの最大呼び出し深さは1234です。QNXでは、デフォルトのスタックサイズが他のほとんどのプラットフォームよりも小さいため、最大呼び出し深さは640となります。

QV4_GC_TIMELIMIT

この値は、各増分ガベージコレクションのステップでエンジンが費やすべき時間を指定するために使用されます。値は、ミリ秒単位の時間制限を指定する正の数、または 0 のいずれかです。値が 0 の場合、ガベージコレクションは非増分方式になります。
QV4_MM_AGGRESSIVE_GCこの環境変数を設定すると、メモリ割り当てのたびにガベージコレクタが実行されます。これは実行時に非常に負荷が高くなりますが、C++ から QML エンジンに属するオブジェクトを手動で削除してしまうなど、多くのメモリ管理エラーを迅速に発見することができます。
QV4_MM_CROSS_VALIDATE_INCREMENTAL_GCこの環境変数を設定すると、追加のデバッグ処理が実行され、増分ガベージコレクタの動作を非増分ガベージコレクタの動作と比較することで、増分ガベージコレクタの動作異常を特定します。
QV4_PROFILE_WRITE_PERF_MAPLinux では、perf ユーティリティを使用してプログラムのプロファイリングを行うことができます。JIT コンパイルされた JavaScript 関数を分析するには、それらの名前とメモリ上の位置を知る必要があります。この情報を提供するために、/tmpディレクトリにperf-<pid>.map という特別なファイルを作成し、perf がそれを読み取るという慣例があります。この環境変数が設定されている場合、JIT はこのファイルを生成します。
QV4_SHOW_BYTECODEQt によって生成された IR バイトコードをコンソールに出力します。QML_DISABLE_DISK_CACHE と組み合わせて使用する必要があります。そうしないと、すでにキャッシュされているバイトコードは表示されません。
QV4_DUMP_BASIC_BLOCKS事前にコンパイルされた各関数の基本ブロックを出力します。ブロックの詳細がコンソールに表示されます。さらに、コンパイルされた各関数について、各ブロックのバイトコードを含む制御フローグラフが DOT 形式で生成されます。QV4_DUMP_BASIC_BLOCKS の値は、DOTファイルを生成するフォルダのパスとして使用されます。パスが ["-", "1", "true"] のいずれかである場合、またはファイルを開けない場合は、代わりにグラフが標準出力(stdout)に出力されます。
QV4_VALIDATE_BASIC_BLOCKS事前にコンパイルされた関数の基本ブロックに対してチェックを行い、その構造と整合性を検証します。検証に失敗した場合、コンソールにエラーメッセージが出力されます。

QMLディスクキャッシュは、その動作を微調整するための環境変数をさらに受け付けます。特に、QML_DISABLE_DISK_CACHE はデバッグに役立ちます。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.