[JSInfo] 메모리 정리 (가비지 컬렉션)

cptkuk91·2021년 10월 3일
0

JSInfo

목록 보기
11/26

자바스크립트의 메모리 관리, 쓸모없는 엔진을 찾아내 삭제하는 것을 얘기합니다.

자바스크립트는 도달 가능성(reachability) 를 바탕으로 메모리를 정리합니다. 도달 가능한 메모리는 삭제되지 않습니다.

도달 가능한 경우 명백한 이유 없이 삭제되지 않습니다.

자바스크립트에서 쓸모없는 엔진을 찾아내 삭제하는 걸 '가비지 컬렉터'라고 합니다.

가비지 컬렉터는 끊임없이 동작하고 있는 모든 객체를 모니터링하고 있습니다. 도달할 수 없는 객체는 삭제합니다.

ex) user.name 에 KJ라는 데이터가 있는 상태

let user = {
    name: "KJ",
};

let admin = user;

ex) 아래와 같이 KJ를 Null로 변경 시 admin에 들어있던 KJ는 메모리에서 삭제될 수 있습니다.

let user = {
    name: null,
};

let admin = user;

연결된 객체

2개의 참조를 받던 객체가 하나만 끊어지면 메모리 정리를 안당하지만, 2개의 참조 모두 끊어진다면 참조 받던 대상은 메모리에서 삭제됩니다.

도달할 수 없는 객체

아무리 수 많은 객체들이 연결될지라도 특정 객체만 도달 방법이 없으면 도달받지 못한 객체는 전부 메모리에서 삭제됩니다.

내부 알고리즘

mark and sweep 이라고 불리는 가비지 컬렉션 알고리즘입니다.
루트 정보를 수집 후 mark(기억) 합니다.
루트가 도달할 수 있는 곳이라면 모두 mark(기억) 합니다.
한 번 방문 한 mark(기억)은 재도달 하지 않습니다.
mark(기억)이 없는 객체는 메모리에서 삭제합니다.

세대별 수집 (generational collection) 일정 시간 이상 동안 살아남은 객체는 오래된 객체로 분리하고 가비지 컬렉터가 자주 감시하지 않습니다. 하지만 새롭게 생성 된 객체는 공격적으로 감시하며 메모리 제거에 앞장서요.

점진적 수집 (incremental collection) 은 너무 많은 객체가 있을 경우 천천히 돌아다니면서 메모리 정리를 합니다.

유휴 시간 수집 (idle time collection) 은 CPU 사용량이 낮을 때 가비지 컬렉션을 실행합니다.

기타 다양한 가비지 컬렉션 알고리즘이 존재합니다.

객체에 도달 불가능할 경우 메모리가 삭제됩니다. 가비지 컬렉션은 Auto 입니다. 억지로 실행하거나 막을 수 없습니다.

profile
메일은 매일 확인하고 있습니다. 궁금하신 부분이나 틀린 부분에 대한 지적사항이 있으시다면 언제든 편하게 연락 부탁드려요 :)

0개의 댓글