[TIL : 43] 가비지 컬렉션, 캐시

jabae·2022년 5월 2일
0

TIL

목록 보기
43/44

🗑 가비지 컬렉션(Garbage Collection)

📂 가비지 컬렉션이란?

가비지 컬렉션이란 프로그램에서 더 이상 사용하지 않는 메모리를 자동으로 정리하는 것이다. 동적 할당된 메모리 영역 가운데 이상 사용하지 않는 영역을 탐지해 자동으로 해지하여 메모리 누수를 막을 수 있다. 이 기능을 가진 언어(혹은 엔진)는 자바, C#, 자바스크립트 등이 있다. C언어는 없다. 손수 해제 시켜줘야 한다. free~

📂 가비지 컬렉션 방법

대부분의 가비지 컬렉팅 기법은 트레이싱(tracing) 방식을 사용한다. 트레이싱 방식은 한 개 이상의 변수가 접근 가능한 메모리는 앞으로 사용할 수 있는 메모리로 간주하고, 그 밖의 메모리를 해제하는 방식을 가리킨다. 트레싱 방식 중 하나가 마크 앤 스윕(mark and sweep)이다. 일부는 가비지 컬렉팅 기법으로 참조 카운팅 방식을 사용한다.

✔️ 마크 앤 스윕(mark and sweep)

한 객체에 flag를 두고, 가비지 컬렉션 사이클마다 flag에 표시 후 삭제하는 mark and sweep 방법이다.

객체에 in-use flag를 두고, 사이클마다 메모리 관리자가 모든 객체를 추적해서 사용 중인지 아닌지를 표시(mark)한다.

그리고나서 표시되지 않은 객체를 삭제(sweep)하는 단계를 통해 메모리를 해제한다.

✔️ 레퍼런스 카운팅(Reference Counting)

한 객체를 참조하는 변수의 수를 추적하는 방법이다. 객체를 참조하는 변수는 처음에는 특정 메모리에 대해 레퍼런스가 하나뿐이지만, 변수의 레퍼런스가 복사될 때마다 레퍼런스 카운트가 늘어난다. 객체를 참조하고 있던 변수의 값이 바뀌거나, 변수 스코프를 벗어나면 레퍼런스 카운트는 줄어든다.

레퍼런스 카운트가 0이 되면 아무도 그 객체에 대한 레퍼런스를 가지고 있지 않다는 말과 같으므로, 그 객체와 관련한 메모리는 비울 수 있다.

🤔 크롬 브라우저 및 node.js의 v8 엔진은 어떻게 가비지 컬렉팅을 하고 있을까?
Memory terminology
V8 엔진(자바스크립트, NodeJS, Deno, WebAssembly) 내부의 메모리 관리 시각화하기

💰 캐시(Cache)

📂 캐시란?

자주 사용하는 데이터나 많은 시간이나 연산이 필요한 작업의 결과를 저장해두는 것을 의미한다. 컴퓨팅에서 캐시는 일반적으로 일시적인(temporarily) 데이터를 저장하기 위한 목적으로 존재하는 고속의 데이터 저장 공간이다. 첫 작업 이후에 이 데이터에 대한 요청이 있을 경우, 데이터의 기본 저장 공간에 접근할 때보다 더 빠르게 요청을 처리할 수 있다. 따라서 캐싱을 사용하면 이전에 검색하거나 계산한 데이터를 효율적으로 재사용할 수 있다.

📂 캐시의 작동원리

캐시의 데이터는 일반적으로 RAM(Random Access Memory)과 같이 빠르게 액세스할 수 있는 하드웨어에 저장되며, 소프트웨어 구성 요소와 함께 사용될 수도 있다. 캐시의 주요 목적은 기본 스토리지 계층(SSD, HDD)에 액세스하여 데이터를 가져오는 작업을 줄임으로써 더 빠르게 요청을 처리할 수 있어 데이터 검색의 성능을 높이는 것이다.

속도를 위해 용량을 절충하는 캐시는 일반적으로 데이터의 하위 집합을 일시적으로 저장한다. 완전하고 영구적인 데이터가 있는 데이터베이스와는 대조적이다.

📂 캐시의 장점

  1. 애플리케이션 성능 개선 : 인 메모리 캐시에서 데이터를 읽는 속도가 매우 빠르다. 빠른 데이터 액세스는 애플리케이션의 전반적인 성능을 개선한다.

  2. 데이터베이스 비용 절감 : 단일 캐시 인스턴스는 수십만 IOPS를 제공할 수 있으며, 따라서 수많은 데이터베이스 인스턴스를 대체할 수 있으므로 총 비용을 절감할 수 있다.

  3. 백엔드 부하 감소 : 캐싱은 상당 부분을 백엔드 데이터베이스에서 인 메모리 계층으로 리디렉션함으로써 데이터베이스의 로드를 줄이고 로드 시에 성능이 저하되거나 작업 급증 시에 작동이 중단되지 않도록 보호할 수 있다.

  4. 예측 가능한 성능 : 데이터베이스에 대한 로드가 증가하면 데이터를 가져오는 데 있어 지연 시간이 길어지고 전반적인 애플리케이션 성능이 예측 불가능해진다. 높은 처리량의 인 메모리 캐시를 활용함으로써 이 문제를 완화할 수 있다.

  5. 데이터베이스 핫스팟 제거 : 인 메모리 캐시에 공통 키를 저장하면 가장 자주 액세스하는 데이터에 대해 예측 가능한 빠른 성능을 제공하는 동시에 초과 프로비저닝의 필요성을 줄일 수 있다.

  6. 읽기 처리량(IOPS) 증가 : 인 메모리 시스템은 지연 시간을 줄일 뿐만 아니라 유사한 디스크 기반 데이터베이스에 비해 훨씬 높은 요청 속도(IOPS)를 제공한다.

🤔 웹서비스에서 캐시가 적용되는 예

  • 클라이언트: HTTP 캐시 헤더, 브라우저
  • 네트워크: DNS 서버, HTTP 캐시 헤더, CDN, 리버스 프록시
  • 서버 및 데이터베이스: 키-값 데이터 스토어(e.g. Redis), 로컬 캐시(인-메모리, 디스크)

📚 참고

profile
it's me!:)

0개의 댓글