V8엔진의 GC

deli-ght·2022년 1월 6일
0

CS

목록 보기
6/9
post-thumbnail

node.js 프로세스 메모리

V8 memory structure 사용
: Java Script는 단일 스레드 - V8도 단일 프로세스를 사용하므로 서비스 작업자를 사용하면 작업당 새 V8 프로세스가 생성.

실행 중인 프로그램은 항상 V8 프로세스에서 할당된 메모리로 표시
= resident set

heap memory

: 객체 또는 동적 데이터를 저장하는 곳

가비지 컬렉션이 발생하는 곳. 전체 힙 메모리에서 가비지 컬렉션이 발생하진 않고, Young & Old space에서만 관리된다.

new space (young generation)

: 새로운 객체가 저장되거나 대부분의 객체들이 잠깐 저장되는 곳. 이 공간은 작고 두 작은 공간이 있다. (JVM의 S0,S1과 비슷함) 이 공간은 Scavenger(Minor GC)에 의해 관리된다고 함.

old space (old generation)

: 두개의 MinorGC 주기 동안 살아남은 객체가 이동되는 곳. Major GC(Mark-Sweep & Mark-Compact)에서 관리

V8 메모리 관리: 가비지 컬렉션

스택에서 더 이상 직접 또는 간접적으로 (다른 개체의 참조를 통해) 참조되지 않는 개체가 사용하는 메모리를 해제하여 새 개체 생성을 위한 공간을 만든다.

V8의 가비지 컬렉터는 두 세대로 나뉜다.

Minor GC (스캐빈저) - cheney 알고리즘

  • 스택 포인터에서 시작해 재귀적으로 탐색해 사용중이거나 살아있는 개체를 다른 곳으로 옮김(from→to) - 남아있는 객체 삭제 - 옮겼던 개체들을 다시 옮김 (to → from) 이 과정을 반복하면서 두번째 마이너때도 살아남은 아이들이 old로 옮겨짐

Major GC

https://i.imgur.com/rcjSZ0T.mp4

실행중인 개체 마킹(DFS) → 가비지 콜렉터가 힙을 탐색하며 메모리 주소 기록 → 압축

  • 여러 헬퍼 thread로 나뉘어서 실행해 동시에 마킹, 스위핑, 압축
  • 약간의 일시 중지 시간이 발생

가비지 콜렉터

https://proandroiddev.com/a-garbage-collection-story-2421b96e4c84
https://d2.naver.com/helloworld/1329

Mark & Sweep - JVM , C# , Ruby , JavaScript 및 Golang
참조 카운팅 - PHP , Perl 및 Python

참조 : https://deepu.tech/memory-management-in-v8/
JVM stack and heap : https://www.youtube.com/watch?v=UzaGOXKVhwU
JVM garbage collector : https://www.youtube.com/watch?v=vZRmCbl871I&list=PLuvXomsX65mgmapU6rJ-UDROMOrzqyZVR&index=29

profile
PRE-FE에서 PRO-FE로🚀🪐!

0개의 댓글