配置JavaScript引擎#

描述了可用于控制JavaScript运行的可用环境变量。

运行JavaScript代码受几个环境变量的影响,尤其

环境变量

描述

QV4_JIT_CALL_THRESHOLD

JavaScript引擎包含一个即时编译器(JIT)。JIT会将经常运行的JavaScript函数编译成机器代码以加快运行速度。此环境变量决定函数需要运行多少次才能被视为要编译到JIT。默认值是3次。

QV4_FORCE_INTERPRETER

设置此环境变量会使所有函数和表达式通过解释器执行。JIT永远不会使用,无论函数或表达式调用多少次。函数和表达式仍然可以使用qmlcachegenqmlsc 提前编译,但运行时仅使用生成的字节码。任何生成的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栈大小只有间接相关,因为每次JavaScript函数调用都会消耗C++和JavaScript栈上的栈空间。检查过度递归的代码必然是保守的,因为可用的栈空间取决于许多因素,通常可以由用户自定义。设置此环境变量后,JavaScript引擎在编译或运行JavaScript时不会检查栈溢出,也不会为此生成异常。相反,当栈溢出时,程序试图执行无效的内存访问。这很可能会终止程序。结果,程序可以完全耗尽操作系统可以提供的所有栈空间。

警告

恶意代码可能能够通过这种方式逃避终止并访问意外的内存位置。

QV4_MAX_CALL_DEPTH

当运行(而非编译)JavaScript时,通过控制调用深度(即嵌套函数调用的数量)来防止堆栈溢出。默认情况下,如果调用深度超过针对平台默认堆大小调优的最大值,将生成一个异常。如果QV4_MAX_CALL_DEPTH环境变量包含一个数字,则使用此数字作为最大调用深度。请注意,编译JavaScript时的递归限制不受影响。大多数平台上的默认最大调用深度为1234。在QNX上为640,因为QNX的默认堆大小比大多数平台要小。

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可能对调试很有用。