Javascript 메모리관리

황혜빈·2020년 10월 8일
0

자바스크립트는 메모리를 직접 할당해야 하는 저수준 언어와 달리 객체가 생성되었을 때 자동으로 메모리를 할당하고 쓸모 없어졌을 때 자동으로 해체한다(가비지 컬렉션).

1. 메모리 생존주기

  1. 필요할때 할당한다.
  2. 사용한다.
  3. 필요없어지면 해체한다.

두번째 부분은 모든 언어에서 명시적으로 사용된다. 그러나 첫 번째 부분과 마지막 부분은 저수준언어에서는 명시적이며, 자바스크립트와 같은 대부분의 고수준 언어에서는 암묵적으로 작동한다.

자바스크립트와 같은 고수준 언어들은 "가비지 콜렉션"이라는 자동 메모리 관리 방법을 사용한다. 가바지 콜렉터의 목적은 메모리 할당을 추적하고 할당된 메모리 블록이 더이상 필요하지 않게되면 판단하여 회수하는 것이다.

2. 가비지 콜렉션

"더 이상 필요하지 않은"모든 메모리를 찾는건 비결정적 문제다. 따라서 가비지컬렉터들은 이 문제에 대한 제한적인 해결책을 구현한다.

  • 참조
    가비지 컬렉션 알고리즘의 핵심은 참조이다. A라는 메모리를 통해(명시적이든 암시적이든) B라는 메모리에 접근할 수 있다면 "B는 A에 참조된다"라고한다.

  • 가비지 컬렉션 기준 : 자바스르킵트는 도달 가능성이라는 개념을 통해 메모리 관리를 수행한다. "도달가능한"값은 쉽게 말해 어떻게던 접근하거나 사용할 수 있는 값을 의미한다. 도달가능한 값은 메모리에서 삭제되지 않는다.

  • 자바스크립트 엔젠 내에서 가비지 컬렉터가 끊임없이 작동합니다. 가비지 컬렉터는 모든 객체를 모니터링하고 도달할 수 없는 객체는 삭제합니다.

  • 밑에 값은 태생부터 도달 가능하기 때문에 명백한 이유없이는 삭제되지 않는다.
    ex) 현재함수의 지역변수와 매개변수,전역변수,기타등등
    루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이된다.

  1. 내부알고리즘

    -"mark and sweep"라 불리는 가비지 컬렉션 기본 알고리즘에 대해 알아보자.

    1. 가비지컬렉터는 루트(root)정보를 수집하고 이를 "mark(기억) 한다.
    2. 루트가 참조하고 있는 모든 객체를 방문하고 이를 "mark"한다.
    3. mark된 모든 객체에 방문하고 그 객체들이 참조하고 있는 객체도 mark한다.
    4. 루트에서 도달가능한 모든 객체를 방문할 때까지 위 과정을 반복한다.
    5. mark되지 않는 모든 객체를 메모리에서 삭제한다.
  2. 요약

  • 가비지 컬렉션은 엔진이 자동으로 수행하므로 개발자는 이를 억지로 실행하거나 막을 수 없다.
  • 객체는 도달 가능한 상태일 떄 메모리에 남는다.
  • 참조된다고 해서 도달가능 한 것은 아니다. 서로 연결된 객체들도 도달 불가능할수 있다.

참고 :
https://ko.javascript.info/garbage-collection

0개의 댓글