V8은 대략 다음 구성 요소로 이루어짐
흐름은 다음과 같이 동작
JS 코드 -> 파싱 -> AST -> 바이트코드 생성(Ignition)
-> 실행 중 프로파일링 -> 최적 경로 수집
-> TurboFan이 최적화된 머신 코드를 생성
즉 "처음엔 인터프리터, 나중엔 JIT 컴파일러"
-> 실행 시간이 길어질수록 성능이 빨라진다.
V8은 Node.js에서 JS를 빠르게 돌려주는 JIT + GC 기반 엔진이고,
Node는 이 위에 이벤트 루프/비동기 IO를 얹은 런타임이다.
Java(JVM)랑 비교하면, IO-bound에는 개발, 운영이 가볍고,
CPU-bound나 강한 타입/툴링 면에서는 Java가 더 유리하다.
공통점
☕️ Java(JVM) 쪽이 강한 부분
✅ Node.js(V8) 쪽이 강한 부분
비동기 leak이 실무에서 진짜 많이 발생함
예시
setInterval(() => {
// ...
}, 1000); // clear 안함
async function loop() {
while (true) {
await doSomething(); // break 없음
}
}
Promise가 계속 쌓이고 GC가 회수할 타이밍 놓치면
해결책
이것도 실무에서 은근히 흔함
예시
emitter.on('event', handler);
핸들러를 계속 등록하는데 제거 안하면 메모리 누수 발생
Node가 다음 경고를 띄움
해결
--max-old-space-size, expose-gc 등)