"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > JavaScript 메모리 관리 및 가비지 수집

JavaScript 메모리 관리 및 가비지 수집

2024-11-08에 게시됨
검색:895

JavaScript 애플리케이션이 성장함에 따라 성능 최적화가 필수적이 되었습니다. 중요한 측면 중 하나는 메모리를 효율적으로 관리하는 것입니다. JavaScript의 자동 가비지 수집(GC)이 도움이 되지만 작동 방식과 메모리 누수 방지 방법을 이해하면 앱 성능을 크게 향상시킬 수 있습니다. 이 게시물에서는 최신 JavaScript 엔진의 메모리 관리 기술과 고급 GC 동작에 대해 자세히 설명합니다.

JavaScript의 메모리 할당
JavaScript는 변수가 선언되면 자동으로 메모리를 할당하고 더 이상 필요하지 않으면 할당을 취소합니다. 그러나 복잡한 앱에서 리소스를 효율적으로 관리하려면 메모리가 할당되는 방식(스택과 힙)을 아는 것이 중요합니다.

1. 스택 메모리:

  • 기본 값(예: 숫자, 부울)을 저장합니다.

  • LIFO(후입선출) 액세스로 더 작은 데이터에도 더 빠르게 액세스할 수 있습니다.

2. 힙 메모리:

  • 객체, 함수 등 참조 유형에 사용됩니다.

  • 액세스 규모가 크고 느리지만 유연합니다.

가비지 수집 작동 방식
JavaScript는 표시 및 청소 알고리즘을 사용하여 사용되지 않는 메모리를 제거합니다. 객체가 더 이상 참조되지 않으면 "쓰레기"가 되어 수집할 수 있습니다. 그러나 자동 GC에 의존하면 메모리가 잘못 관리될 경우 문제가 발생할 수 있습니다.

  • Mark-and-Sweep: GC는 루트(전역 실행 컨텍스트)에서 시작하여 도달 가능한 개체를 표시하고 표시되지 않은 개체는 가비지로 간주됩니다.

  • 세대 가비지 수집: 많은 JavaScript 엔진(예: V8)은 메모리가 "젊은" 세대와 "오래된" 세대로 분할되는 세대별 GC를 사용합니다. 젊은 세대는 더 자주 수집하는 반면, 오래된 세대는 수명이 긴 물건을 처리합니다.

메모리 누수 방지
자동 GC를 사용하더라도 객체에 대한 참조가 의도치 않게 유지되면 메모리 누수가 여전히 발생할 수 있습니다. 일반적인 원인은 다음과 같습니다.

  • 의도하지 않은 전역 변수: let, const 또는 var를 사용하지 않으면 전역 변수가 생성되어 가비지 수집을 방지할 수 있습니다.
function leak() {
  myGlobalVar = 'I am global';
}
  • 클로저: 부적절하게 사용된 클로저는 외부 변수에 대한 참조를 필요 이상으로 오래 유지할 수 있습니다.
function outer() {
  let largeObject = { /* some data */ };
  return function inner() {
    console.log(largeObject);
  };
}
  • 이벤트 리스너: DOM 요소에 연결된 이벤트 리스너를 제거하는 것을 잊어버리면 해당 요소가 DOM에서 제거된 후에도 메모리 할당이 유지될 수 있습니다.
const element = document.getElementById('myButton');
element.addEventListener('click', () => console.log('Clicked'));
// Be sure to remove listeners when not needed
  • 분리된 DOM 노드: DOM 노드가 제거되었지만 여전히 코드의 다른 곳에서 참조되는 경우 메모리가 해제되지 않습니다.
const element = document.getElementById('myElement');
document.body.removeChild(element);

메모리 최적화를 위한 고급 기술

1.수동 메모리 프로파일링: 브라우저 개발자 도구를 사용하여 메모리 사용량을 프로파일링하고 누수 또는 불필요하게 지속되는 개체를 감지합니다.

  • Chrome DevTools: 힙 스냅샷을 위한 메모리 탭.

  • Firefox: 메모리 누수를 위한 성능 도구.

2.WeakMaps 및 WeakSets: 가비지 수집을 방지하지 않고 객체를 저장하려면 WeakMap 또는 WeakSet을 사용하세요. 이러한 구조는 객체에 대한 다른 참조가 없을 때 자동 GC를 허용합니다.

let wm = new WeakMap();
let obj = {};
wm.set(obj, 'someValue');
obj = null; // 'obj' is now eligible for GC.

3.루프 및 재귀 최적화: 테일 콜 최적화 또는 반복 방법을 사용하여 재귀 함수에서 불필요한 메모리 소비를 방지합니다. 또한 메모리 급증을 일으킬 수 있는 대규모 루프나 배열 작업에는 주의하세요.

4.지연 및 지연 로딩: 즉시 필요하지 않은 스크립트 및 자산을 지연하거나 지연 로딩하여 메모리 사용량을 최적화하고 불필요한 메모리 소비를 방지합니다.

결론:

JavaScript의 가비지 수집기는 많은 작업을 처리하지만, 메모리 할당 및 해제 방식을 염두에 두면 특히 복잡하거나 장기 실행되는 애플리케이션에서 성능을 향상할 수 있습니다. 이러한 메모리 관리 전략을 적용하면 앱이 확장됨에 따라 성능을 유지할 수 있습니다.


읽어주셔서 감사합니다! 자신의 프로젝트에 사용하는 생각이나 고급 메모리 관리 팁을 자유롭게 공유해 주세요.??
내 웹사이트를 방문하세요: https://shafayet.zya.me


당신을 위한 밈이 있나요?

JavaScript Memory Management and Garbage Collection

릴리스 선언문 이 글은 https://dev.to/shafayeat/javascript-memory-management-and-garbage-collection-2a?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3