配置 JavaScript 引擎
JavaScript 代码的运行会受到一些环境变量的影响,尤其是以下环境变量:
环境变量 | 说明 |
---|---|
QV4_JIT_CALL_THRESHOLD | JavaScript 引擎包含一个即时编译器(JIT)。JIT 会将频繁运行的 JavaScript 函数编译成机器代码,以加快运行速度。这个环境变量决定了一个函数需要运行多少次才能被考虑进行 JIT 编译。默认值为 3 次。 |
QV4_FORCE_INTERPRETER | 设置此环境变量后,所有函数和表达式都将通过解释器运行。无论函数或表达式被调用多少次,都不会使用 JIT。函数和表达式仍可使用qmlcachegen或qmlsc 提前编译,但运行时只使用生成的字节码。任何生成的 C++ 代码和由此产生的机器代码都将被忽略。 |
QV4_JS_MAX_STACK_SIZE | JavaScript 引擎会保留一个特殊的内存区域作为堆栈来运行 JavaScript。这个堆栈与 C++ 堆栈是分开的。通常这个区域的大小为 4MB。如果环境变量中包含一个数字,JavaScript 引擎就会将其理解为分配给 JavaScript 栈的内存区域的大小(以字节为单位)。 |
QV4_GC_MAX_STACK_SIZE | 除了常规的 JavaScript 栈,JavaScript 引擎还会为垃圾回收器保留另一个栈,通常为 2MB 内存。如果垃圾回收器需要同时处理过多的对象,这个堆栈可能会超限。如果环境变量中包含一个数字,那么它将被解释为以字节为单位分配给垃圾收集器的堆栈内存区域的大小。 |
QV4_CRASH_ON_STACKOVERFLOW | 通常情况下,JavaScript 引擎会尝试捕捉因 JavaScript 代码过度递归而导致的 C++ 堆栈溢出,并生成一个非致命错误条件。编译 JavaScript 和运行 JavaScript 时会分别进行递归检查。编译 JavaScript 时出现堆栈溢出表明代码包含深嵌套对象和函数。运行时出现堆栈溢出则表明代码包含深度递归程序。由于 JavaScript 的每次函数调用都会消耗 C++ 和 JavaScript 堆栈中的堆栈空间,因此这种检查与上述 JavaScript 堆栈大小只是间接相关。检查是否存在过度递归的代码必然是保守的,因为可用的堆栈大小取决于很多因素,通常可以由用户自定义。设置了这个环境变量后,JavaScript 引擎在编译或运行 JavaScript 时不会检查堆栈溢出,也不会产生异常。相反,当堆栈溢出时,程序会尝试无效的内存访问。这很可能会终止程序。反过来,程序会耗尽操作系统所能提供的所有堆栈空间。 警告: 恶意代码可能会以这种方式逃避终止并访问意外的内存位置。 |
QV4_MAX_CALL_DEPTH | 通过控制调用深度(即嵌套函数调用的次数),可以防止 JavaScript 在运行(而非编译)过程中出现堆栈溢出。默认情况下,如果调用深度超过了根据平台默认堆栈大小调整的最大值,就会产生异常。如果QV4_MAX_CALL_DEPTH 环境变量中包含一个数字,该数字将被用作最大调用深度。请注意,编译 JavaScript 时的递归限制不会受到影响。在大多数平台上,默认最大调用深度为 1234。在 QNX 上是 640,因为 QNX 的默认堆栈大小小于大多数平台。 |
| 该值用于告诉引擎在每个增量垃圾回收步骤中应花费多少时间。它可以是以毫秒为单位指定时限的正数,也可以是 0。 |
QV4_MM_AGGRESSIVE_GC | 设置该环境变量后,垃圾回收器会在每次内存分配前运行。这在运行时非常昂贵,但它能迅速发现许多内存管理错误,例如手动删除属于 C++ QML 引擎的对象。 |
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
对调试尤其有用。
© 2025 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.