1// Copyright (C) 2019 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
5\page qtqml-javascript-finetuning.html
6\title Configuring the JavaScript Engine
7\brief Describes the environment variables available, to control how Javascript is run.
9Running JavaScript code can be influenced by a few environment variables, particularly:
13 \li Environment Variable
16 \li \c{QV4_JIT_CALL_THRESHOLD}
17 \li The JavaScript engine contains a Just-In-Time compiler (JIT). The JIT will compile
18 frequently run JavaScript functions into machine code to run faster. This
19 environment variable determines how often a function needs to be run to be
20 considered for JIT compilation. The default value is 3 times.
22 \li \c{QV4_FORCE_INTERPRETER}
23 \li Setting this environment variable disables the JIT and runs all
24 functions through the interpreter, no matter how often they are called.
26 \li \c{QV4_JS_MAX_STACK_SIZE}
27 \li The JavaScript engine reserves a special memory area as a stack to run JavaScript.
28 This stack is separate from the C++ stack. Usually this area is 4MB in size. If this
29 environment variable contains a number, the JavaScript engine interprets it as the
30 size of the memory area, in bytes, to be allocated as the JavaScript stack.
32 \li \c{QV4_GC_MAX_STACK_SIZE}
33 \li In addition to the regular JavaScript stack, the JavaScript engine keeps another stack
34 for the garbage collector, usually 2MB of memory. If the garbage collector needs to
35 handle an excessive number of objects at the same time, this stack might overrun.
36 If it contains a number, this environment variable is interpreted as the size in bytes
37 of the memory area that will be allocated as the stack for the garbage collector.
39 \li \c{QV4_CRASH_ON_STACKOVERFLOW}
40 \li Usually the JavaScript engine tries to catch C++ stack overflows caused by
41 excessively recursive JavaScript code, and generates a non-fatal error condition.
42 There are separate recursion checks for compiling JavaScript and running JavaScript. A
43 stack overflow when compiling JavaScript indicates that the code contains deeply nested
44 objects and functions. A stack overflow at run-time indicates that the code results in
45 a deeply recursive program. The check for this is only indirectly related to the
46 JavaScript stack size mentioned above, as each JavaScript function call consumes stack
47 space on both, the C++ and the JavaScript stack. The code that checks for excessive
48 recursion is necessarily conservative, as the available stack size depends on many
49 factors and can often be customized by the user. With this environment variable set, the
50 JavaScript engine does not check for stack overflows when compiling or running
51 JavaScript and will not generate exceptions for them. Instead, when the stack overflows
52 the program attempts an invalid memory access. This most likely terminates the
53 program. In turn, the program gets to use up all the stack space the operating system
55 \warning malicious code may be able to evade the termination and access unexpected
56 memory locations this way.
58 \li \c{QV4_MAX_CALL_DEPTH}
59 \li Stack overflows when running (as opposed to compiling) JavaScript are prevented by
60 controlling the call depth: the number of nested function invocations. By
61 default, an exception is generated if the call depth exceeds a maximum number tuned
62 to the platform's default stack size. If the \c{QV4_MAX_CALL_DEPTH} environment
63 variable contains a number, this number is used as maximum call depth. Beware that
64 the recursion limit when compiling JavaScript is not affected. The default maximum
65 call depth is 1234 on most platforms. On QNX it is 640 because on QNX the default
66 stack size is smaller than on most platforms.
68 \li \c{QV4_MM_AGGRESSIVE_GC}
69 \li Setting this environment variable runs the garbage collector before each memory
70 allocation. This is very expensive at run-time, but it quickly uncovers many memory
71 management errors, for example the manual deletion of an object belonging to the QML
74 \li \c{QV4_PROFILE_WRITE_PERF_MAP}
75 \li On Linux, the \c perf utility can be used to profile programs. To analyze JIT-compiled
76 JavaScript functions, it needs to know about their names and locations in memory. To
77 provide this information, there's a convention to create a special file called
78 \c{perf-<pid>.map} in \e{/tmp} which perf then reads. This environment variable, if
79 set, causes the JIT to generate this file.
81 \li \c{QV4_SHOW_BYTECODE}
82 \li Outputs the IR bytecode generated by Qt to the console.
83 Has to be combined with \c{QML_DISABLE_DISK_CACHE} or already cached bytecode will not
86 \li \c{QV4_DUMP_BASIC_BLOCKS}
87 \li Outputs the basic blocks of each function compiled ahead of time. The details of the
88 blocks are printed to the console. Additionally, control flow graphs with the byte code
89 for each block are generated in the DOT format for each compiled function. The value of
90 \c {QV4_DUMP_BASIC_BLOCKS} is used as the path to the folder where the DOT files should
91 be generated. If the path is any of ["-", "1", "true"] or if files can't be opened,
92 the graphs are dumped to stdout instead.
95\l{The QML Disk Cache} accepts further environment variables that allow fine tuning its behavior.
96In particular \c{QML_DISABLE_DISK_CACHE} may be useful for debugging.