본문 바로가기

FrontEnd

In Clouser-with-javascript

Clouser-with-javascript

JavaScript

자바스크립트 메모리 관리와 관련된 데이터 구조

 

자바스크립트의 메모리 관리 메커니즘은 효율적인 데이터 구조를 통해 크게 강화됩니다. 이러한 데이터 구조들은 개발자들이 데이터 관리의 복잡성을 줄이고, 메모리 사용을 최적화할 수 있게 돕습니다. 특히, Map, Set, WeakMap, WeakSet과 같은 구조는 자바스크립트에서 데이터 관리의 한계를 극복하고 보다 섬세한 메모리 관리를 가능하게 합니다.

 

객체(Object)와 배열(Array)의 한계 전통적으로 자바스크립트에서는 객체(Object)와 배열(Array)을 통해 데이터를 관리해 왔습니다. 하지만 이러한 방식은 특정 상황에서 복잡성과 한계를 드러냅니다.

 

예를 들어, 배열을 사용할 때 중복 값을 제어하기 위해서는 배열 내에 동일한 값이 존재하는지를 반복적으로 확인해야 합니다. 대규모 데이터를 처리할 때 이러한 접근 방식은 과도한 성능 저하를 초래할 수 있습니다. 객체를 사용할 때의 키값은 문자열 또는 Symbol로 제한되어 있습니다. 이는 숫자나 객체와 같은 다양한 타입을 키로 사용하고자 하는 경우, 제약사항으로 작용합니다. 키가 문자열로 암묵적으로 변환되면서 예측하지 못한 방식으로 데이터가 저장되거나 접근되는 문제가 발생할 수 있습니다.

 

Map 그리고 Set

 

이러한 문제를 해결하기 위해 등장한 것이 Map과 Set입니다. Map은 키와 값을 연결하는 구조로, 키에 다양한 타입을 사용할 수 있습니다. 이는 객체의 한계를 극복하고, 보다 유연한 데이터 관리를 가능하게 합니다. Map은 키의 유일성을 보장하며 순서를 유지하는 특성 덕분에 성능적으로도 이점을 제공합니다.

 

Set은 유일한 값을 저장하는 구조로, 배열에서 중복 값을 관리하는 데 있어서의 복잡성을 해소합니다. Set 내부에서는 각 값이 오직 한 번만 나타날 수 있으므로, 데이터의 유일성을 자동으로 관리할 수 있습니다.

 

WeakMap과 WeakSet WeakMap과 WeakSet은 Map과 Set의 변형으로, 객체에 대한 약한 참조를 저장합니다. 이 데이터 구조들은 가비지 컬렉션의 대상이 될 수 있는 객체를 키(WeakMap의 경우) 또는 값(WeakSet의 경우)으로 저장할 때 유용합니다. 객체에 대한 참조가 이 데이터 구조 외부에 존재하지 않을 때, 자동으로 메모리에서 해제될 수 있습니다. 이는 메모리 누수를 방지하고, 보다 효율적인 메모리 관리를 가능하게 합니다.

 

Map, Set, WeakMap, WeakSet과 같은 데이터 구조는 자바스크립트 개발자들이 데이터를 보다 효율적으로 관리하고, 메모리 사용을 최적화할 수 있도록 도와주는 유용한 메서드입니다.

 

WeakMap WeakSet

WeakMap과 WeakSet의 등장은 메모리 관리의 혁신적인 발전을 의미합니다. Map과 Set이 강력한 데이터 구조임에도 불구하고, 이들이 메모리 누수의 원인이 될 수 있다는 사실은 개발자들에게 상당한 고민의 원인이 되었습니다.

 

특히, Map의 경우 객체를 키로 사용할 때, 해당 객체에 대한 외부 참조가 사라져도 Map 내부에서는 해당 객체가 여전히 존재하여 가비지 컬렉션의 대상이 되지 않는 문제가 발생하였습니다. 이는 대규모 애플리케이션에서 메모리 사용량을 비효율적으로 만들며, 성능 저하의 주요 원인이 될 수 있습니다.

 

이러한 문제의 해결책으로 탄생한 WeakMap과 WeakSet은 기존의 Map과 Set의 기능을 기반으로 하면서도, 메모리 관리의 효율성을 극대화한 '약한' 버전의 데이터 구조입니다. 이들의 가장 큰 특징은 객체에 대한 '약한 참조(weak reference)'를 사용한다는 점입니다. 약한 참조는 가비지 컬렉션의 대상 결정에 있어서 참조되는 객체에 영향을 미치지 않습니다. 이는 객체가 더 이상 필요하지 않을 때 자동으로 메모리에서 해제될 수 있도록 하여 메모리 누수를 방지합니다.

WeakMap의 특성과 활용

WeakMap은 key-value 쌍을 저장하는 컬렉션으로, Map의 특성을 가지되 몇 가지 중요한 차이점이 있습니다.

 

첫째, WeakMap의 키는 반드시 객체여야 합니다. 즉, 원시 값을 키로 사용할 수 없으며, 이는 키로 사용되는 객체에 대한 약한 참조를 가능하게 합니다. 이러한 약한 참조는 WeakMap 내부의 키-값 쌍이 가비지 컬렉션의 대상이 될 수 있도록 합니다. 만약 WeakMap의 키로 사용된 객체에 대한 다른 어떠한 참조도 없게 되면, 해당 객체는 자동으로 WeakMap 및 메모리에서 제거됩니다. 이는 개발자가 명시적으로 참조를 끊을 필요 없이 메모리를 효율적으로 관리할 수 있게 합니다.

 

WeakMap과 WeakSet은 keys(), values(), entries()와 같은 순회 가능한 반복 작업을 지원하지 않습니다. 이는 약한 참조의 특성상, 언제 어떤 객체가 메모리에서 제거될지 예측할 수 없기 때문입니다. 이러한 특성 때문에 WeakMap은 특히 메모이제이션(Memoization)과 같은 캐싱 전략에서 유용하게 사용될 수 있습니다. 메모이제이션은 계산 결과를 저장해 두었다가 동일한 계산 요청이 있을 때 재계산 없이 저장된 결과를 반환하는 기법으로 메모리 사용량을 줄이고 성능을 향상할 수 있습니다.

가비지 컬렉션

가비지 컬렉션(Garbage Collection, GC)은 현대 프로그래밍 언어의 메모리 관리에서 중추적인 역할을 수행합니다. 이 과정은 더 이상 사용되지 않는 객체들을 자동으로 식별하고 메모리에서 해제함으로써, 개발자가 직접 메모리를 관리하는 복잡성을 줄이고 메모리 누수를 방지합니다.

 

가비지 컬렉션의 핵심 알고리즘으로는 Mark-and-Sweep 알고리즘과 Tri-color 마킹 알고리즘이 있습니다. 이 두 알고리즘은 "더 이상 참조되지 않아 필요 없는 객체"를 "도달할 수 없는 객체"로 정의하며, 가비지 컬렉션의 기본 로직을 형성합니다.

 

Mark-and-Sweep 알고리즘

 

Mark-and-Sweep 알고리즘은 가비지 컬렉션의 가장 기본적인 형태로, 두 단계로 구성됩니다. 첫 번째 단계인 '마킹' 단계에서는 모든 '도달 가능한' 객체들을 식별하고 마크합니다. 이 과정은 'root'로 불리는 객체 집합에서 시작하여, root에서 도달할 수 있는 모든 객체들을 찾아나갑니다. 두 번째 단계인 '스위핑' 단계에서는 마킹되지 않은, 즉 도달할 수 없는 객체들을 메모리에서 제거합니다.

Tri-color 알고리즘

 

Tri-color 알고리즘은 가비지 컬렉션 과정을 세 가지 색상(white, gray, black)으로 표현하여 보다 세밀한 메모리 관리를 가능하게 합니다. 초기에는 모든 객체를 'white'로 마킹하여 가비지로 간주합니다. 'gray'는 아직 처리해야 할 객체를 의미하며, 'black'은 처리가 완료된 객체를 나타냅니다. 이 알고리즘은 가비지 컬렉션 과정을 더욱 효율적으로 만들어, 메모리 관리의 정확도를 높입니다.

'FrontEnd' 카테고리의 다른 글

Docker  (0) 2024.04.07
NodeJS  (0) 2024.03.26
React-JS  (0) 2024.03.22
HTTP-Header  (0) 2024.03.22
Cross-Browsing  (0) 2024.03.21