자바스크립트 엔진 구성

자바스크립트 코드 실행에는 몇 가지 환경 변수가 영향을 미칠 수 있으며, 특히 다음과 같습니다:

환경 변수설명
QV4_JIT_CALL_THRESHOLD자바스크립트 엔진에는 JIT(Just-In-Time) 컴파일러가 포함되어 있습니다. JIT는 자주 실행되는 자바스크립트 함수를 기계어로 컴파일하여 실행 속도를 높여줍니다. 이 환경 변수는 함수가 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일반 자바스크립트 스택 외에도, 자바스크립트 엔진은 가비지 컬렉터를 위해 또 다른 스택을 유지하며, 이 스택은 대개 2MB의 메모리를 차지합니다. 가비지 컬렉터가 동시에 처리해야 할 객체의 수가 지나치게 많을 경우, 이 스택이 오버플로우될 수 있습니다. 이 환경 변수에 숫자가 포함되어 있으면, 가비지 컬렉터용 스택으로 할당될 메모리 영역의 크기(바이트 단위)로 해석됩니다.
QV4_STACK_SOFT_LIMIT이 환경 변수가 설정되어 있으면, 호출 스택 사용량이 정의된 소프트 제한에 도달하는 즉시 자바스크립트 엔진은 "RangeError: Maximum call stack size exceeded" 예외를 발생시킵니다. 변수가 설정되어 있지 않으면, 엔진은 OS에 따라 런타임에서 감지된 제한 또는 Qt에서 미리 정의된 제한을 기본값으로 사용합니다.
QV4_CRASH_ON_STACKOVERFLOW일반적으로 자바스크립트 엔진은 지나치게 재귀적인 자바스크립트 코드로 인해 발생하는 C++ 스택 오버플로를 감지하여 치명적이지 않은 오류 상태를 발생시킵니다. 자바스크립트 컴파일 시와 실행 시에는 별도의 재귀 검사가 수행됩니다. 자바스크립트 컴파일 중 발생하는 스택 오버플로는 코드에 깊게 중첩된 객체와 함수가 포함되어 있음을 나타냅니다. 런타임에 발생하는 스택 오버플로는 코드가 깊게 재귀적인 프로그램을 생성함을 의미합니다. 이에 대한 검사는 앞서 언급한 자바스크립트 스택 크기와 간접적으로만 관련이 있습니다. 각 자바스크립트 함수 호출은 C++ 스택과 자바스크립트 스택 모두에서 스택 공간을 소비하기 때문입니다. 사용 가능한 스택 크기는 여러 요인에 따라 달라지며 종종 사용자가 직접 조정할 수 있으므로, 과도한 재귀를 검사하는 코드는 필연적으로 보수적으로 설계됩니다. 이 환경 변수가 설정되어 있으면, 자바스크립트 엔진은 자바스크립트를 컴파일하거나 실행할 때 스택 오버플로우를 검사하지 않으며, 이에 대한 예외도 발생시키지 않습니다. 대신, 스택이 오버플로우되면 프로그램은 무효한 메모리 액세스를 시도합니다. 이로 인해 프로그램이 종료될 가능성이 높습니다. 결과적으로, 프로그램은 운영 체제가 제공할 수 있는 모든 스택 공간을 소진하게 됩니다.

경고: 악성 코드는 이러한 방식으로 프로그램 종료 처리를 회피하고 예상치 못한 메모리 위치에 접근할 수 있습니다.

QV4_MAX_CALL_DEPTH자바스크립트 컴파일 시가 아닌 실행 시 발생하는 스택 오버플로는 호출 깊이(중첩된 함수 호출 횟수)를 제어하여 방지됩니다. 기본적으로 호출 깊이가 플랫폼의 기본 스택 크기에 맞춰 조정된 최대 수치를 초과하면 예외가 발생합니다. ` QV4_MAX_CALL_DEPTH ` 환경 변수에 숫자가 포함되어 있으면, 이 숫자가 최대 호출 깊이로 사용됩니다. 단, 자바스크립트 컴파일 시의 재귀 제한에는 영향을 미치지 않는다는 점에 유의하십시오. 대부분의 플랫폼에서 기본 최대 호출 깊이는 1234입니다. QNX의 경우 기본 스택 크기가 대부분의 플랫폼보다 작기 때문에 최대 호출 깊이는 640입니다.

QV4_GC_TIMELIMIT

이 값은 엔진이 각 증분 가비지 컬렉션 단계에서 소요해야 할 시간을 지정하는 데 사용됩니다. 이 값은 시간 제한을 밀리초 단위로 지정하는 양수이거나 0일 수 있습니다. 값이 0인 경우, 가비지 컬렉션은 비증분 방식으로 수행됩니다.
QV4_MM_AGGRESSIVE_GC이 환경 변수를 설정하면 각 메모리 할당 전에 가비지 컬렉터가 실행됩니다. 이는 런타임에서 매우 많은 자원을 소모하지만, 예를 들어 C++에서 QML 엔진에 속한 객체를 수동으로 삭제하는 경우와 같은 많은 메모리 관리 오류를 신속하게 발견할 수 있습니다.
QV4_MM_CROSS_VALIDATE_INCREMENTAL_GC이 환경 변수를 설정하면 증분 가비지 컬렉터의 동작을 비증분 가비지 컬렉터의 동작과 비교하여, 증분 가비지 컬렉터가 비정상적으로 동작하는 경우를 파악하기 위한 추가 디버깅 단계가 실행됩니다.
QV4_PROFILE_WRITE_PERF_MAP리눅스에서는 perf 유틸리티를 사용하여 프로그램 프로파일링을 수행할 수 있습니다. JIT로 컴파일된 자바스크립트 함수를 분석하려면 해당 함수의 이름과 메모리 내 위치를 파악해야 합니다. 이 정보를 제공하기 위해 /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.