[JS] 자바스크립트의 메모리 관리 (가비지 컬렉터)

2023. 3. 7. 22:05·개발/html, css, js
728x90
반응형

JS의 레퍼런스

js는 다른 언어와 다르게 포인터의 개념이 없다.

그렇기 때문에 포인터라는 개념 대신 참조(reference)를 이용한다.

*GO언어는 포인터도 있고 가비지컬렉터가 있다. 포인터가 없다고 해서 가비지컬렉터가 있는건 아니다.

 

자바스크립트에서 변수에 값을 할당할 때, 실제 값이 저장되는 것이 아니라 값이 저장된 메모리 주소를 참조하는 방식으로 동작한다. 따라서 변수를 이용하여 값을 변경하면 해당 메모리 주소에 있는 값을 변경하게 된다.

 

예를 들어 아래 코드에서 'obj1'과 'obj2'는 같은 객체를 참조한다.

따라서 'obj1'의 프로퍼티를 변경하면 'obj2'에서도 변경된 값을 확인할 수 있다.

var obj1 = { name: "John" };
var obj2 = obj1;

obj1.name = "Jane";
console.log(obj2.name); // "Jane" 출력

위 예시에서 'obj1' 변수에 객체 리터럴을 할당하고, 'obj2' 변수에 'obj1'을 할당한다.

이후 'obj1'의 'name' 프로퍼티를 변경하면 'obj2'에서도 변경된 값을 확인할 수 있다.

이는 'obj2'가 'obj1' 과 같은 객체를 참조하기 때문이다.

 

따라서 자바스크립트에서는 포인터라는 개념을 사용하지 않고 참조를 이용하여 객체를 다룬다.

 

객체의 생명주기

 

객채의 생성은 new 연산자를 이용하거나 객체  리터럴을 이용하여 생성할 수 있다.

객체가 더 이상 사용되지 않으면 가비지 컬렉터에 의해 검사되어 메모리에서 제거된다.

 

객체는 다양한 이유로 소멸될 수 있다. 

예를 들어, 객체를 참조하던 변수가 다른 객체를 참조하도록 변경될 경우, 해당 객체는 더 이상 참조되지 않은 것으로 간주되어 가비지 컬렉터에 의해 메모리에서 제거된다.

또한, 객체가 명시적으로 소멸되도록 코드를 작성할 수 있다.

 

객체의 생명주기를 관리하는 것은 메모리 누수를 방지하고 성능을 최적화하는 데 중요하다.

따라서 개발자는 객체를 적절하게 생성하고, 사용하지 않는 객체는 최대한 빨리 해제하여 메모리를 효율적으로 관리해야 한다.

 

가비지 컬렉터

메모리 누수를 방지하고 성능을 최적화하는 데 자바스크립트에서는 가비지컬렉터가 사용된다.

가비지컬렉터는 자바스크립트 엔진에서 메모리를 관리하는 기능 중 하나이다.

가비지 컬렉터는 주기적으로 실행되며, 개발자가 실행 주기를 맞추지 못한다.

또한, 더 이상 참조되지 않는 객체들을 검사하여 메모리에서 제거한다.

이는 개발자가 수동으로 메모리를 관리하지 않아도 된다는 장점을 제공한다.

가비지 컬렉터가 실행될 때 일시적으로 애플리케이션의 실행 속도가 느려질 수 있다는 단점도 있다.

 

자바스크립트에서 메모리는 동적으로 할당되고 해제된다.

객체나 변수 등을 생성할 때 메모리가 할당되며, 사용이 끝나면 해당 메모리를 해제해야 한다.

그렇지 않으면 메모리 누수가 발생하여 시스템의 성능을 저하시키고, 결국 애플리케이션의 동작에 영향을 미칠 수 있다.

 

이러한 문제를 해결하기 위해 자바스크립트 엔진은 가비지 컬렉터라는 기능을 제공한다.

가비지 컬렉터는 자동으로 실행되지만, 개발자는 가비지 컬렉터가 언제 실행될지 예측할 수 없다.

따라서 객체나 변수를 사용한 후 적시에 해당 메모리를 해제하는 것이 중요하다.

이를 위해 개발자는 불필요한 객체나 변수를 최대한 빨리 해제하고, 큰 데이터셋이나 긴 생명주기를 가진 객체의 경우는 수동으로 메모리를 해제해주는 것이 좋다.

728x90
반응형

'개발 > html, css, js' 카테고리의 다른 글

[JS] var, let, const 차이  (1) 2022.10.05
[30일 챌린지 Day-17] 관사 제외하고 정렬하기  (0) 2022.08.11
[30일 챌린지 Day-16] Mouse Move Shadow  (0) 2022.08.11
[30일 챌린지 Day-15] LocalStorage  (0) 2022.08.11
[30일 챌린지 Day-13] scroll event  (0) 2022.08.09
'개발/html, css, js' 카테고리의 다른 글
  • [JS] var, let, const 차이
  • [30일 챌린지 Day-17] 관사 제외하고 정렬하기
  • [30일 챌린지 Day-16] Mouse Move Shadow
  • [30일 챌린지 Day-15] LocalStorage
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    CSS
    도커
    js
    프로그래머스
    하이퍼레저
    명령어
    go언어
    mysql
    블록체인
    node
    node.js
    30일 챌린지
    erc20
    React
    30일챌린지
    컨테이너
    ERC721
    html
    go
    nodejs
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[JS] 자바스크립트의 메모리 관리 (가비지 컬렉터)
상단으로

티스토리툴바