가비지 컬랙션(Garbage Collection)은 프로그램에서 사용하지 않는 메모리를 자동으로 정리하는 것이다. 이 기능을 사용하는 언어에는 Java, JavaScript, C# 등이 있다.
C언어에서는 가비지 컬랙션이 없기 때문에 프로그램에서 malloc
등으로 할당한 메모리를 종료 전에 free()
해주지 않으면 메모리 누수(Memory Leak)가 생겼었다. 하지만 FE에서 배운 JavaScript에는 가비지 컬랙션 기능이 있기 때문에 메모리 정리를 따로 하지 않아도 누수가 생기지 않는다. 가비지 컬랙션에는 크게 두 가지 방법이 있다.
트레이싱 기법 중 Mark and Sweep 이라는 방법에 대해서 알아보자. 이름에서 알 수 있듯이 Mark and Sweep은 두 단계로 나뉜다.
위의 두 단계를 합쳐보면, 트레이싱은 가비지 컬랙션 사이클마다 객체를 돌며 사용중인 메모리에 Mark한 뒤, Mark되지 않은 메모리를 해제, 즉 Sweep 하는 방법이다. 주로 Java에서 쓰인다.
이 기법의 단점은, 표시 단계에서 메모리 내용이 변경되지 않아야 하기 때문에 전체 시스템의 실행이 정지된다는 것이다. 또 전체 메모리 영역을 검사해야 하므로 프로그램의 성능이 저하될 수 있다.
레퍼런스 카운팅은 말 그대로 객체를 참조하는 수(Reference Count)의 증가 또는 감소를 통해 메모리를 관리하는 방법이다. 객체를 참조하는 변수의 수를 추적하여 레퍼런스 카운트가 0
이 된 객체와 관련된 메모리를 비운다. 레퍼런스 카운트가 0
이라는 것은, 아무도 그 객체에 대한 레퍼런스가 없다는 뜻이다. Mac OS, Python, PHP 등에 사용된다.
캐시는 일시적인 데이터 하위 집합을 저장하는 고속 데이터 스토리지다. 일반적으로 RAM(Random Access Memory)과 같이 빠르게 액세스할 수 있는 하드웨어에 저장된다. 따라서 이후에 해당 데이터에 대한 요청이 있을 경우 데이터의 기본 스토리지(SSD, HDD)에 액세스할 때보다 빠르게 요청을 처리할 수 있다. 캐싱을 사용하면 데이터 검색 성능을 높일 수 있다.
애플리케이션 성능 개선
메모리는 디스크(마그네틱 또는 SSD)보다 데이터 액세스 속도가 훨씬 빠르기 때문에 애플리케이션의 전반적인 성능이 개선된다.
백엔드 부하 감소
데이터베이스의 로드를 줄임으로 성능이 저하되거나 작동이 중단되지 않도록 보호할 수 있다.
예측 가능한 성능
애플리케이션 사용량 급증으로 데이터베이스에 대한 로드가 증가하면 데이터를 가져오는 시간이 길어지고 애플리케이션 성능이 예측 불가능해진다. 높은 처리량의 인 메모리 캐시를 활용하면 이 문제를 완화할 수 있다.
데이터베이스 핫스팟 제거
많은 애플리케이션에서 유명 인사 프로필이나 인기있는 제품과 같이 더 자주 액세스되는 데이터 집합이 생긴다. 이로 인해 데이터베이스에 핫스팟이 발생할 수 있는데, 인 메모리 캐시에 공통 키를 저장하면 자주 액세스하는 데이터에 대해 빠른 성능을 제공할 수 있다.
읽기 처리량(IOPS) 증가
IOPS(Input/output operations per second)는 HDD, SSD 등 컴퓨터 저장 장치의 성능 측정 단위다. 인 메모리 시스템은 디스크 기반 데이터베이스에 비해 훨씬 높은 요청 속도(IOPS)를 제공한다.
데이터베이스 비용 절감
단일 캐시 인스턴스는 높은 IOPS로 수많은 데이터베이스 인스턴스를 대체할 수 있으므로 총 비용이 절감된다. 기본 데이터베이스에서 처리량당 요금이 부과되는 경우 유용하다.
https://ko.wikipedia.org/wiki/쓰레기수집
https://imasoftwareengineer.tistory.com/103
https://aws.amazon.com/ko/caching/