V8 엔진에 대하여

정재헌·2023년 1월 15일
0

What is V8?

V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++. It is used in Chrome and in Node.js, among others. It implements ECMAScript and WebAssembly, and runs on Windows 7 or later, macOS 10.12+, and Linux systems that use x64, IA-32, ARM, or MIPS processors. V8 can run standalone, or can be embedded into any C++ application.

출처 : https://v8.dev/

V8 엔진은 JavaScript 소스 코드를 compile(엮다) 및 execute(실행)하고, 객체에 대한 메모리 할당을 처리하며 더 이상 필요하지 않은 객체를 garbage collect합니다. V8의 stop-the-world, 세대별, 정확한 garbage collector는 V8 성능의 핵심 중 하나입니다.

그렇다면 sourcode를 compile 한다는 것은 무슨 의미일까?

고성능 언어(ex: python, c#, Java and so on)에서 저성능 언어(binary code-이진수)로, 하지만 컴퓨터는 고성능 언어를 바로 이해하지 못한다. 그렇기 때문에 우리는 이를 해석하기 위한 장치가 필요하다. 이로 인해 compiler와 interpreter가 탄생하였다. 두 가지 모두 고성능 언어를 저성능 언어로 translate 해주는 프로그램이라고 볼 수 있다.

compiler에서는 syntax error에 대해 체크할 수 있지만 logical error에 대해서는 해결해주지 못한다. 영어를 예로 들어 생각해보면, sdas asdids asdkak 는 영어 단어를 사용함에 있어서는 아무런 문제가 없지만 하나의 문장 또는 단어로서는 아무런 논리적 의미를 전달해주지는 못한다.

출처 : https://www.programiz.com/article/difference-compiler-interpreter

그렇다면, garbage collector는 무엇이며 왜 중요할까?

garbage collector는 메모리를 관리해주는 시스템의 중요한 요소라고 할 수 있다. garbage collector의 목적은 프로그램에서 더이상 사용되지 않는 메모리들을 자동적으로 식별하고 재활용하는 것에 있다. 이는 memory leaks(메모리 누수는 프로그램이 결국 충돌할 때까지 점점 더 많은 양의 메모리를 사용하게 할 수 있다.)를 막아주기 때문에 중요한 것이다.

V8 JavaScript 엔진의 경우, garbage collector는 JavaScript 개체 및 기타 데이터 구조에서 더 이상 사용하지 않는 메모리를 정리하는 역할을 한다. JavaScript 개체가 저장되는 메모리 영역인 힙을 주기적으로 분석하여 라이브 개체에서 더 이상 연결할 수 없는 개체를 식별함으로써 이를 수행하는 것이다. 이러한 개체가 식별되면 안전하게 할당을 해제하여 사용하던 메모리를 시스템으로 다시 해제할 수 있게 된다.

V8 엔진은 garbage collector가 프로그램 성능에 미치는 영향을 최소화하도록 설계된 "Incremental Mark-Sweep"이라는 알고리즘을 사용한다. garbage collector을 한 번에 모두 수행하는 대신 시간이 지남에 따라 분산되는 작은 청크로 수행하여 이를 수행하는 것이다. 이렇게 하면 garbage collector을 수행하기 위해 잠깐만 일시 중지하면서 프로그램이 원활하게 계속 실행된다.

또한 V8 엔진은 메모리 압축 및 메모리 할당과 같은 성능을 향상시키기 위해 몇 가지 다른 기술을 사용한다. 전반적으로 garbage collector은 자바스크립트가 브라우저에서 원활하게 실행되도록 하고 메모리를 관리하며 충돌 및 성능 저하를 방지하는 핵심 메커니즘 중 하나이다.

더 깊은 이해를 위해서는 Major GC, Minor GC로 나누어 공부해야 한다!

앞으로도 추가적으로 계속 공부하여 수정해 나갈 예정이다.

profile
백엔드 개발자

0개의 댓글