가비지 컬렉션

moono·2023년 3월 27일

JavaScript

목록 보기
23/23

프로그램에서 더 이상 사용하지 않는 메모리를 자동으로 정리하는 것
⇒ Javascript는 객체가 생성되었을 때 자동으로 메모리를 할당하고 필요하지 않다면 자동으로 해제하는 가비지 컬렉션이 내장되어 있다.
⇒ Javascript 가 어떻게 메모리를 관리하는지 알아야 앱의 속도 저하, 예기치 못한 종료, 느린 응답 속도의 문제가 왜 일어나는지 알 수 있다.


🏁 메모리의 생존 주기

필요할 때 개발자가 할당 → 할당된 메모리를 사용 → 메모리 더이상 필요하지 않으면 해제

➰ 메모리 할당

값을 선언할 때 자동으로 메모리를 할당

let arr = [100, 200, 300, 400]

➰ 할당된 메모리 사용 (값 사용)

할당된 메모리를 읽고 쓰는 것을 의미

➰ 메모리 해제

할당된 메모리가 더이상 필요 없다면 해제해야 앱의 성능을 저하시키지 않는다.

가비지 컬렉션의 목적은 메모리 할당을 추적하고, 할당된 메모리 블록이 더이상 필요하지 않은지 스스로 판단 후 메모리를 해제한다.
⇒ 언어 스스로 판단하는 것은 비결정적인 영역, 그래서 고수준 언어에 내장된 가비지 컬렉터들은 제한적은 해결책을 구현한다.


🏁 대표적인 가비지 컬렉션의 방법

레퍼런스 카운팅(참조 횟수 계산) 과 트레이싱이 유명한데,
이 둘은 참조 개념에 의존하고 있다.

참조(Reference)
메모리 관리 관점에서 어떤 객체가 다른 객체에 접근할 수 있다면 다른 객체를 참조한다.
(객체를 참조하는 것에 대해, 객체란 함수 스코프, 글로벌 렉시컬 스코프까지도 포함한다.)

렉시컬 스코핑
변수의 이름이 중첩된 함수에서 해석되는 방식을 정의.
중첩되어 있는 더 안쪽의 함수는 부모 함수가 값을 반환한 다음에도 부모 함수의 스코프를 포함하고 있다.

➰ 레퍼런스 카운팅(참조 횟수 계산)

한 객체를 참조하는 변수의 수를 추적하는 방법 (가장 단순한 형태의 가비지 컬렉션 알고리즘)

변수의 레퍼런스가 복사될 때 마다 레퍼런스 카운트가 늘어남.
객체를 참조하고 있던 변수의 값이 바뀌거나 변수 스코프를 벗어나면 레퍼런스 카운트는 줄어든다.
레퍼런스 카운트 0 이 되면, 해당 객체와 관련한 메모리는 비울 수 있음

➰ 트레이싱

한 객체에 flag를 두고, 가비지 컬렉션 사이클마다 flag 에 표시 후 삭제하는 mark and sweep 방법
객체에 in-use flag를 두고 사이클마다 메모리 관리자가 모든 객체를 추적해 사용 중인지 아닌지를 표시(mark) 하고,
표시되지 않은 객체를 삭제(sweep) 하는 단계 통해 메모리를 해제한다.
⇒ 대부분의 가비지 컬렉션이 mark and sweep 알고리즘을 이용한 가비지 컬렉터를 장착


메모리 누수

가비지 컬렉션 언어에서 메모리 누수의 주요 원인은 예상치 못한 참조 이다.

예상치 못한 참조 : 더 이상 사용되지 않을거라 생각했지만, 어떤 이유로 활성화 상태인 루트 트리 안에 존재하는 메모리 조각들
⇒ 더이상 사용되지 않지만 코드 상 어딘가에 유지되어 해제되지 못한 변수들

메모리 누수의 일반적인 3가지 형태 : 우발적으로 생성된 전역변수 , DOM 외부에서의 참조 , 클로저의 잘못된 사용

0개의 댓글