[CS] 가비지 컬렉션 & 메모리 누수

Jae ·2021년 11월 26일
0

Computer Science

목록 보기
4/5

자바스크립트 안에서 가비지 컬렉션이 사용되고 있는데 어떻게 코드를 작성해야만 메모리 누수를 방지할 수 있는지에 대해 알아보자.

가비지 컬렉션은 무엇이고 어떻게 동작할까?

Allocate memory -> User memory -> Release memory

JS에서 쓰레기란?
Allocate memory 할당 즉 저장이 되어지고
Use memory 더 이상 사용되어지지 않는 메모리인데
Release memory 아직 방출되어지지 않은 메모리

할당 -> 사용 -> 방출

어떻게 Allocate 되는지 살펴보자.

먼저 메모리는 무엇인가?

컴퓨터에서 0과 1로 표현되어진 어떤 값이 어딘가에 저장이 되어진 주소다.

만약 자바스크립트에서

let person = 'good';

이라는 값을 할당했을 때

컴퓨터에서는 이 자바스크립트 언어를 컴파일해야 하는데, 결국 컴퓨터는 0과 1 그리고 주소값을 참조하는 것이다.

주소를 참조 하기 위해서는 person이라는 주소(변수명)에 'good'이라는 주소값이 저장이 되어있는지 알아야 한다.

컴퓨터의 입장에서 이 person은 메모리 주소값이다. 만약 이 주소값에 memory address 4127963 같은 값이 설정되어 있다면, 결국 10111001... 이런 컴퓨터가 이해할 수 있는 언어로 치환되어 컴퓨터로 전달되는 것이다.

다시 돌아와서 가비지 컬렉팅할 때 가비지는 더 이상 필요없는 메모리, not Use 사용되지 않는 메모리지만, not Release 방출되지 않은 메모리값이다.

C언어는 가비지 컬렉팅을 하는 함수가 따로 있지만,
JS는 가비지 컬렉팅을 자동으로 실행해준다.

하지만 자동으로 실행되기 때문에 어떠한 문제가 발생한다.

가비지 컬렉터가 메모리가 쓸모없는 메모리인지 여부를 판별하기 위한 방법은 뭘까?

바로 Memory references를 갖고 메모리가 가비지인지 아닌지 가비지컬렉터가 판별한다.

  • implicit reference
    자바스크립트 객체는 프로토타입을 참조한다. 예를 들어
function A () {}

이렇게 빈 객체를 생성자 함수를 만들어주면 위에서 let person = 'good' 처럼 값을 할당하지 않았는데도 prototype을 가지고 있다.

  • explicit reference

1. 가비지 컬렉션은 무엇이고, 가비지 컬렉션 기능을 가진 언어는 무엇인가?

  • 가비지 컬렉션은 프로그램에서 더 이상 사용하지 않는 메모리를 자동으로 정리하는 것
  • 이 기능을 가진 언어(혹은 엔진)는 자바, C#, 자바스크립트 등이 있다.

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

  • Mark-and-sweep(tracing):

  • 한 객체에 flag를 두고, 가비지 컬렉션 사이클마다 flag에 표시 후 삭제하는 mark and sweep 방법

  • 객체에 in-use flag를 두고, 사이클마다 메모리 관리자가 모든 객체를 추적해서 사용 중인지 아닌지를 표시(mark)한다. 그 후 표시되지 않은 객체를 삭제(sweep)하는 단계를 통해 메모리를 해제한다.

  • 레퍼런스 카운팅: 한 객체를 참조하는 변수의 수를 추적하는 방법

    • 객체를 참조하는 변수는 처음에는 특정 메모리에 대해 레퍼런스가 하나뿐이지만, 변수의 레퍼런스가 복사될 때마다 레퍼런스 카운트가 늘어난다.
    • 객체를 참조하고 있던 변수의 값이 바뀌거나, 변수 스코프를 벗어나면 레퍼런스 카운트는 줄어든다.
    • 레퍼런스 카운트가 0이 되면, 그 객체와 관련한 메모리는 비울 수 있다. 레퍼런스 카운트가 0이 된다는 말은 아무도 그 객체에 대한 레퍼런스를 가지고 있지 않다는 말과 같다.

    레퍼런스 카운팅의 한계 : 레퍼런스 카운팅

https://blog.sessionstack.com/how-javascript-works-memory-management-how-to-handle-4-common-memory-leaks-3f28b94cfbec

0개의 댓글