자바스크립트 엔진 구성하기

자바스크립트 코드 실행은 특히 몇 가지 환경 변수에 의해 영향을 받을 수 있습니다:

환경 변수설명
QV4_JIT_CALL_THRESHOLDJavaScript 엔진에는 JIT(Just-In-Time 컴파일러)가 포함되어 있습니다. JIT는 자주 실행되는 JavaScript 함수를 머신 코드로 컴파일하여 더 빠르게 실행합니다. 이 환경 변수는 JIT 컴파일에 고려할 함수 실행 빈도를 결정합니다. 기본값은 3회입니다.
QV4_FORCE_INTERPRETER이 환경 변수를 설정하면 인터프리터를 통해 모든 함수와 표현식이 실행됩니다. 함수나 표현식이 아무리 자주 호출되더라도 JIT는 사용되지 않습니다. 함수와 표현식은 여전히 qmlcachegen 또는 qmlsc를 사용하여 미리 컴파일할 수 있지만, 런타임에는 생성된 바이트 코드만 사용됩니다. 생성된 모든 C++ 코드와 그로 인해 생성된 머신 코드는 무시됩니다.
QV4_JS_MAX_STACK_SIZEJavaScript 엔진은 JavaScript를 실행하기 위해 특수 메모리 영역을 스택으로 예약합니다. 이 스택은 C++ 스택과 분리되어 있습니다. 일반적으로 이 영역의 크기는 4MB입니다. 이 환경 변수에 숫자가 포함되어 있으면 자바스크립트 엔진은 이를 자바스크립트 스택으로 할당할 메모리 영역의 크기(바이트 단위)로 해석합니다.
QV4_GC_MAX_STACK_SIZE자바스크립트 엔진은 일반 자바스크립트 스택 외에도 가비지 컬렉터를 위한 또 다른 스택(보통 2MB의 메모리)을 유지합니다. 가비지 컬렉터가 동시에 과도한 수의 객체를 처리해야 하는 경우 이 스택이 오버런될 수 있습니다. 숫자가 포함된 경우 이 환경 변수는 가비지 수집기의 스택으로 할당될 메모리 영역의 바이트 단위 크기로 해석됩니다.
QV4_CRASH_ON_STACKOVERFLOW일반적으로 JavaScript 엔진은 지나치게 재귀적인 JavaScript 코드로 인해 발생하는 C++ 스택 오버플로를 포착하여 치명적이지 않은 오류 조건을 생성합니다. 자바스크립트 컴파일과 자바스크립트 실행에 대한 별도의 재귀 검사가 있습니다. 자바스크립트 컴파일 시 스택 오버플로는 코드에 깊이 중첩된 객체와 함수가 포함되어 있음을 나타냅니다. 런타임에 스택 오버플로는 코드가 심도 있는 재귀 프로그램을 생성한다는 것을 나타냅니다. 각 JavaScript 함수 호출은 C++ 스택과 JavaScript 스택 모두에서 스택 공간을 사용하므로 이를 확인하는 것은 위에서 언급한 JavaScript 스택 크기와 간접적으로만 관련이 있습니다. 사용 가능한 스택 크기는 여러 요인에 따라 달라지고 사용자가 사용자 정의할 수 있기 때문에 과도한 재귀를 검사하는 코드는 반드시 보수적으로 작성해야 합니다. 이 환경 변수를 설정하면 JavaScript 엔진은 JavaScript를 컴파일하거나 실행할 때 스택 오버플로를 검사하지 않으며 예외를 생성하지 않습니다. 대신 스택 오버플로우가 발생하면 프로그램이 잘못된 메모리 액세스를 시도합니다. 이 경우 프로그램이 종료될 가능성이 높습니다. 결국 프로그램은 운영 체제에서 제공할 수 있는 모든 스택 공간을 사용하게 됩니다.

경고: 악성 코드는 이러한 방식으로 종료를 회피하고 예기치 않은 메모리 위치에 액세스할 수 있습니다.

QV4_MAX_CALL_DEPTH자바스크립트를 실행할 때(컴파일할 때와 반대로) 스택 오버플로는 호출 깊이(중첩된 함수 호출 수)를 제어하여 방지할 수 있습니다. 기본적으로 호출 깊이가 플랫폼의 기본 스택 크기에 맞게 조정된 최대 수를 초과하면 예외가 생성됩니다. QV4_MAX_CALL_DEPTH 환경 변수에 숫자가 포함되어 있으면 이 숫자가 최대 호출 깊이로 사용됩니다. 자바스크립트 컴파일 시 재귀 제한은 영향을 받지 않으므로 주의하세요. 대부분의 플랫폼에서 기본 최대 호출 깊이는 1234입니다. QNX에서는 기본 스택 크기가 대부분의 플랫폼보다 작기 때문에 640입니다.
QV4_MM_AGGRESSIVE_GC이 환경 변수를 설정하면 각 메모리 할당 전에 가비지 수집기가 실행됩니다. 이는 런타임에 매우 비용이 많이 들지만, 예를 들어 C++에서 QML 엔진에 속한 객체를 수동으로 삭제하는 등의 많은 메모리 관리 오류를 빠르게 발견할 수 있습니다.
QV4_PROFILE_WRITE_PERF_MAPLinux에서는 perf 유틸리티를 사용하여 프로그램을 프로파일링할 수 있습니다. JIT 컴파일된 JavaScript 함수를 분석하려면 해당 함수의 이름과 메모리 내 위치를 알아야 합니다. 이 정보를 제공하기 위해 /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 은 디버깅에 유용할 수 있습니다.

© 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.