配置 JavaScript 引擎
运行 JavaScript 代码可能会受到一些环境变量的影响,特别是:
| 环境变量 | 说明 |
|---|---|
QV4_JIT_CALL_THRESHOLD | JavaScript 引擎包含一个即时编译器(JIT)。JIT 会将频繁执行的 JavaScript 函数编译为机器码,以提高运行速度。此环境变量决定了函数需要被执行多少次才会被纳入 JIT 编译的考虑范围。默认值为 3 次。 |
QV4_FORCE_INTERPRETER | 设置此环境变量后,所有函数和表达式都将通过解释器运行。无论函数或表达式被调用多少次,都不会使用 JIT。 函数和表达式仍可通过qmlcachegen或qmlsc 进行预编译,但在运行时仅使用生成的字节码。任何生成的 C++ 代码及其衍生的机器码均会被忽略。 |
QV4_FAIL_ON_INVALID_AOT | 编译为 C++ 的 QML 代码将在运行时进行验证。如果验证失败,默认情况下,该代码将由解释器执行,而非作为原生代码运行。设置此环境变量后,验证失败将导致程序终止。这有助于确保所有能够作为原生代码运行的代码确实以原生方式运行。 |
QV4_SKIP_AOT_VALIDATION | 此环境变量会跳过对编译后 QML 代码生成的 C++ 代码的运行时验证。这可用于避免验证本身带来的开销。请注意,这仅跳过验证过程,并不会阻止 qmlcachegen 生成验证代码本身。如需实现此目的,请使用qt_add_qml_module 的NO_GENERATE_AOT_VALIDATION 选项。 |
QV4_JS_MAX_STACK_SIZE | JavaScript 引擎会预留一个特殊的内存区域作为栈来运行 JavaScript。该栈与 C++ 栈是分离的。通常该区域的大小为 4MB。如果此环境变量包含一个数值,JavaScript 引擎会将其解释为以字节为单位、用于分配 JavaScript 栈的内存区域大小。 |
QV4_GC_MAX_STACK_SIZE | 除了常规的 JavaScript 栈外,JavaScript 引擎还会为垃圾回收器保留另一个栈,通常占用 2MB 内存。 如果垃圾回收器需要同时处理过多的对象,该栈可能会溢出。如果该环境变量包含一个数值,则将其解释为将分配给垃圾回收器栈的内存区域大小(以字节为单位)。 |
QV4_STACK_SOFT_LIMIT | 当设置此环境变量时,一旦调用栈使用量达到定义的软限制,JavaScript 引擎将抛出“RangeError: Maximum call stack size exceeded”异常。如果未设置该变量,引擎将根据操作系统默认使用运行时检测到的限制或 Qt 预定义的限制。 |
QV4_CRASH_ON_STACKOVERFLOW | 通常,JavaScript 引擎会尝试捕获由过度递归的 JavaScript 代码引起的 C++ 栈溢出,并生成一个非致命错误。 针对 JavaScript 的编译和运行,分别设有独立的递归检查机制。编译 JavaScript 时发生的栈溢出表明代码中包含深度嵌套的对象和函数;运行时发生的栈溢出则表明代码导致了深度递归的程序。 对此的检查与上述 JavaScript 栈大小仅间接相关,因为每次 JavaScript 函数调用都会同时消耗 C++ 栈和 JavaScript 栈上的空间。检查过度递归的代码必然采取保守策略,因为可用栈大小取决于许多因素,且通常可由用户自定义。 设置此环境变量后,JavaScript 引擎在编译或运行 JavaScript 时不会检查栈溢出,也不会为此抛出异常。相反,当栈溢出时,程序会尝试进行无效的内存访问。这极有可能导致程序终止。进而,程序将能够用尽操作系统所能提供的全部栈空间。 警告:恶意 代码可能借此规避终止机制,并访问意外的内存位置。 |
QV4_MAX_CALL_DEPTH | 在运行(而非编译)JavaScript 时,通过控制调用深度(即嵌套函数调用的层数)来防止栈溢出。默认情况下,如果调用深度超过根据平台默认栈大小调整的最大值,则会触发异常。如果环境变量 `QV4_MAX_CALL_DEPTH ` 包含一个数值,则该数值将作为最大调用深度。 请注意,这不会影响编译 JavaScript 时的递归限制。在大多数平台上,默认最大调用深度为 1234。在 QNX 平台上,该值为 640,因为 QNX 的默认栈大小小于大多数平台。 |
| 该值用于告知引擎在每次增量垃圾回收步骤中应花费多少时间。它可以是一个正数(以毫秒为单位指定时间限制),也可以是 0。如果值为 0,垃圾回收将转为非增量模式。 |
QV4_MM_AGGRESSIVE_GC | 设置此环境变量将在每次内存分配前运行垃圾回收器。虽然这在运行时开销很大,但能快速发现许多内存管理错误,例如从 C++ 手动删除属于 QML 引擎的对象。 |
QV4_MM_CROSS_VALIDATE_INCREMENTAL_GC | 设置此环境变量将执行额外的调试步骤,通过将增量垃圾回收器的行为与非增量垃圾回收器的行为进行比较,从而识别增量垃圾回收器出现异常的情况。 |
QV4_PROFILE_WRITE_PERF_MAP | 在 Linux 上,可以使用perf 工具对程序进行性能分析。要分析 JIT 编译的 JavaScript 函数,该工具需要知道这些函数的名称及其在内存中的位置。为了提供这些信息,通常会在/tmp目录下创建一个名为perf-<pid>.map 的特殊文件,供 perf 读取。如果设置了此环境变量,将触发 JIT 生成该文件。 |
QV4_SHOW_BYTECODE | 将 Qt 生成的 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.