컴퓨터 과학에서 가비지 컬랙션은 쓰레기를 수집한다는 그대로의 의미를 가지고 있습니다. 자바, C#, JS 등이 이러한 기능을 가지고 있습니다.
C언어같은 저수준 언어의 경우는 메모리 관리를 위해 특정 메소드를 사용해 개발자가 스스로 메모리를 할당하고 해제해야 합니다. 반대로 고수준 언어인 JS같은 경우엔 객체가 생성될 때 자동으로 메모리를 할당하고, 필요하지 않을 때에 자동으로 해제하는 가비지 컬렉션이 지원됩니다.
메모리의 생존주기는 어떤 프로그래밍 언어를 불문하게 대체적으로 비슷하며 다음과 같습니다.
필요할 때 개발자가 할당합니다. ex) int
, float
, double
위에서 할당된 메모리를 사용합니다.
불필요한 상태가 되면 해제합니다. ex) free()
1, 3번 같은 경우엔 저수준 언어인 C언어의 예시로서 고수준 언어인 JS에서는 따로 개발자가 명시해주지 않아도 암묵적으로 작동합니다.
let Apple = ["iPhone", "iPad", "AppleWatch"];
console.log(Apple);
위에서 언급하였듯이 JS상에서는 JS가 자동으로 할당을 해주어서 개발자는 변수를 담을 메모리의 크기를 명시해주지 않아도 됩니다. 이 부분은 자료형을 막론하고 모든 부분에서 자동적으로 이행됩니다.
할당된 메모리를 읽고 쓰는 것을 '사용한다'고 말할 수 있습니다.
할당된 메모리가 더 이상 필요하지 않다면 깨끗이 정리를 해주어야 앱의 성능을 저하시키지 않습니다.
저수준 언어의 경우엔 가비지 컬렉션이라는 자동 메모리 관리 방법이 없기에 개발자가 직접 관여하여 수행합니다. 반면에 고수준 언어의 경우엔 가비지 컬렉션이 불필요한 메모리를 스스로 판단하여 해당 메모리를 해제합니다. 하지만 이 판단 기준은 비결정적인 영역이기에 어느정도 제한적인 해결책을 구현할 수 밖에 없습니다.
가비지 컬렉션은 래퍼런스 카운딩(참조 횟수 계산)과 트레이싱이 두가지 알고리즘이 가장 유명합니다.
참조는 위 두 알고리즘이 의존하는 개념으로서 명시적이든, 암묵적이든 상관없이 메모리 관리 관점에서 어떤 객체가 다른 객체에 접근 가능하다면 다른 객체를 '참조한다'고 말합니다
변수 이름이 중첩된 함수에서 해석되는 방식을 정의한 것으로, 중첩되어 있는 더 안쪽의 함수는 부모 함수가 값을 반환한 다음에도 부모 함수의 스코프를 포함합니다.
가비지 컬렉션 알고리즘, 메모리 누수 내용 추가