ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바스크립트의 메모리 관리법
    프로그래밍 2018. 11. 15. 01:09

    안녕하세요 오늘은 모든 프로그래밍에서 매우 매우 중요한 메모리에 대한 이야기를 Js를 곁들여서 해볼 예정입니다


    먼저 대부분의 언어에서 메모리를 관리하는 방법은 비슷하게 이루어 지는데 다음과 같이 일어납니다

    • 프로그래밍에서 사용가능하게 운영체제에서 메모리를 할당
    • 실제 프로그래머들이 코딩을 하면서 메모리 읽고 사용
    • 프로그램에서 사용 되지않는 메모리를 해제하고 반환
    간단하죠??

    하지만 실제로 저희가 코딩을 하면서 사용하는 부분은 두번째를 제외 하고 할당과 반환에 대해서는 크게 관여를 하지않습니다
    그 이유가 가비지컬렉션이 알아서 처리해주기 때문인데 이 내용은 이번 포스팅의 마지막에 다뤄보겠습니다

    그렇다면 Js에서는 어떻게 메모리 관리가 진행이될까요?

    자바스크립트는 변수를 할당해줄때 메모리도 함께 저장합니다

    var a = 10; 8byte를 할당 Number는 64bit로 이루어져있기에

    즉 위와같이 a를 할당할때 그 할당값을 보고 메모리를 할당해줍니다


    a를 통해서 호출하면 저희는 a에 해당하는 주소를 들어가 값을 읽고 쓰는것이죠


    그렇다면 메모리를 해제할때는 어떻게 할까요?


    사실 가비지컬렉션은 만능이 아닙니다


    생각해보면 이 메모리가 사용이 안되는지 알아야하고 그 확인을 받기위해서는 가비지컬렉션이 직접 알아보며 이 해당 메모리를 사용 즉 참조하는 장소가있는지 확인해봐야하는데 이 부분을 알고리즘으로 판별이 불가능하기 때문입니다


    그렇기에 결국 이러한 과정은 이 메모리를 사용하지않는다라는 추정에 의한 삭제입니다 그렇기에 저희는 코딩을 하면서 가비지컬렉션이 어떤 방식으로 작동하는지 알면 더욱 도움이되고 필요하다고 생각합니다


    그렇다면 Js에서는 가비지 컬렉션이 어떻게 동작하는지 알아보면 한마디로 정의가됩니다

    '이 메모리가 어딘가에서 참조되는가?'라는 한마디로 말이죠 :)


    아시다싶이 Js는 프로토타입언어 기반의 언어입니다 그렇기에 하나의 객체가 프로토체이닝을 통해 여러 객체를 참조 할 수 있는것이죠


    또한 함수 또한 객체이기에 함수 스코프와, 글로벌 렉시컬 스코프 또한 참조한다고 볼수있습니다


    예제를 보면 다음과 같습니다

    var ob = {

    b: {

    c: 2

    }

    } // ob와 ob의 b의 요소인 두개의 객체가 만들어지지만 서로가 서로를 참조하기에 가비지컬렉션 X


    var a1 = ob; // ob의 객체 참조를 a1에서 진행
    ob = 123; // ob에 대한 값을 초기화 하고난후 ob의 참조는 a1에서만 진행
    var a2 = a1.b // b의 객체참조를 a2에서 진행

    a1 = 1; // a1즉 ob를 참조를 하는곳이 아무도 없지만 ob.b를 a2에서 참조하기에 가비지컬렉션 X
    a2 = null // a2를 초기화를 하고나니 ob의 모든 값이 아무곳에서도 참조가 되지않습니다 그렇기에 가비지컬렉션에서 충분히 처리가 가능합니다

    위의 방식처럼 흘러갑니다 그런데 객체는 함수 그렇다면 함수가 계속 객체를 참조한다면?


    function () {

    var a = {};

    var b = {};

    a.b = b;

    b.a = a;

    }

    결국 위의 코드는 참조는 계속 하기에 즉 순환참조이기에 가비지컬렉션에서 처리가 불가능 합니다


    그렇기에 Js의 가비지컬렉션은 마크스위프 알고리즘을 사용합니다


    방식은 다음과 같습니다

    1. Root를 찾습니다 node라면 global객체, browser라면 window가 되겠죠
    2. 루트에서 자식 노드로 내려가면서 연관되어있지 않은 노드들이라면 가비지 컬렉션이 수행이 가능합니다
    3. 그렇게 연결되어 있지않은 노드들은 가비지컬렉션에서 수행합니다
    간단히 GIF로 보면 다음과 같습니다
    출처: https://blog.sessionstack.com/how-javascript-works-memory-management-how-to-handle-4-common-memory-leaks-3f28b94cfbec

    즉 마크스위프 알고리즘을 적용한다면 앞서 말한 외부에서의 순환참조는 가비지컬렉션에서 처리가 가능해집니다



    어떠신가요??


    가비지컬렉션에 대한 이해가 조금이라도 오신다면 이번 블로그 포스팅은 충분히 만족이었다고 생각합니다 :)


    다음 포스팅은 그렇다면 Js에서 메모리 누수에 대하여 게시글을 작성해보고 이의 대표적인 예들을 살펴보겠습니다

    댓글

Designed by Tistory.