티스토리 뷰
가비지 컬렉터 ( Garbage Collector )
가비지 컬렉터란?
- 가비지 컬렉터 ( Garbage Collector ) 줄여서 GC라 부르겠다. GC는 쓰레기 수집기라고 해석할 수 있다. 이름과 어울리게 메모리 내에서 동적으로 할당된 객체중 더 이상 사용되지 않을 객체를 찾아 직접 해제하는 역할을 한다.
가비지 컬렉터의 목적
- GC는 개발자가 메모리를 직접관리 하게 될 때 자주 Memory Leak 이 발생하여, 이러한 해제에 대해서 직접 하지 않게하여 애플리케이션의 안정성을 높이기 위해 탄생하였다.
가비지 컬렉터의 한계
- GC는 결국 객체간 참조관계를 확인하고 삭제하는 과정을 거쳐야하기 때문에, 메모리를 직접관리하는 것 보다 오버헤드가 발생할 수 밖에 없다.
가비지 컬렉터의 알고리즘
가비지 컬렉터는 크게 참조 횟수 가비지 컬렉터와 추적 기반 가비지 컬렉터 두 가지로 나눌 수 있다.
Reference Counting Garbage Collection ( 참조 횟수 가비지 컬렉터 )
참조 횟수 가비지 컬렉터란?
GC의 초기 방식으로 Objective-C 나 Swift 에서 사용하는 방식이다. 각 인스턴스에 refCount(참조 횟수) 를 체크할 수 있도록 하고 refCount 가 0 된 즉, 더 이상 해당 인스턴스에 접근 불가능하게 된 순간 메모리를 해제한다.
장점
- 오버헤드가 분산되어 애플리케이션이 매끄럽다.
- 뒤에 얘기할 추적 기반 가비지 컬렉터의 경우 접근 불가능하게 된 순간과 메모리가 해제되는 순간이 다르다. 즉 어느정도 개수를 모아두었다가 GC를 해제하는 방법을 사용한다. 이 때문에 오버헤드가 한 순간에 발생 하게되는데 그와 반대로 참조 횟수 기반 가비지 컬렉터의 경우 refCount 가 0이 되는 순간 메모리를 해제하기 때문에 오버헤드를 분산할 수 있게 된다. 이 때문에 애플리케이션이 매끄러워진다.
단점
- 순환 참조시 메모리 누수 발생
- refCount 가 0일 때 메모리가 해제된다면, 순환 참조가 발생할 때, 실질적으로 내가 사용하지 않도록 되었어도 힙 메모리 내부에서 서로를 참조하고 있어 메모리가 사라지지 않은 상태로 Memory Leak을 발생시킬 위험이 있다.
Tracing Garbage Collection ( 추적 가비지 컬렉터 )
- 특정 root로 부터 객체의 참조를 따라 들어가 reachable 한 객체와 unreachable 한 객체를 결정하고 unreachable 한 객체의 메모리를 해제하는 방식의 GC다.
- 예를 들어 LinkedList 의 특정 노드 삭제를 위해서는 나를 참조하는 노드가 내 다음 노드를 가르키게만 하면 되는것과 같다고 볼 수 있다.
Mark and Sweep
- 개념
- Root Set 에서 시작하는 참조 관계를 추적하여, Garbage 대상이 아닌 오브젝트에는 Marking을 하고, 그 외의 오브젝트를 Sweep한다.
- Reference Counting Garbage Collection 의 방식에서 순환참조 문제를 해결했다
- 한계
- GC가 Marking or Sweep을 하기 위한, Stop-the-word를 가져와 한 순간에 큰 오버헤드가 생길 수 있다.
- 메모리 단편화(Memory Fragmentation)가 발생하여, 메모리가 충분하여도 사용할 수 없는 상황이 생길 수 있다.
Mark-and-Compact Algorithm
- 개념
- Mark and Sweep 방식의 메모리 단편화라는 단점을 해결하기 위해 나온 방식으로. Sweep 이후 Compact 라는 과정을 포함한다.
- Compact 작업은 Window PC의 조각모음과 같다고 볼 수 있다. Sweep 작업으 파편화 되어있는 사용 메모리를 한 곳으로 모이는 작업을 한다.
- 단점
- Compact라는 작업이 추가되어 메모리 단편화라는 문제는 해결되었지만 작업이 추가되었다는 것은 오버헤드가 늘어났다는 것을 의미한다.
Generational Algorithm
- 배경
- Mark-and-Compact Algorithm 의 약점을 해결하고자 사용된 방법, 가설을 기반으로 생겨났다.
- **대부분의 객체가 금세 접근 불가(unreachable )하게 된다.
- 오래된 객체가 젊은 객체를 참조할 일은 적다.
- Mark-and-Compact Algorithm 의 약점을 해결하고자 사용된 방법, 가설을 기반으로 생겨났다.
- 개념
- 메모리를 Yong 영역과 Old 영역으로 구분하고 GC가 실행될 때 마다 age-bit 값을 증가시킨 후 임계점을 넘었을 때 Yong 영역의 오브젝트를 Old 영역으로 이동시킨다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 세션 불일치
- 동적 타입 언어
- SpringBoot 2.2
- 육각형 아키텍처
- ATDD
- 정적 타입 언어
- pass by value
- multimap
- 외부 단편화
- 뾰족함
- 수평 분할
- 메모리 파편화
- Memory Fragmentation
- 수직 분할
- Object Pool
- 장애 해결기
- Clean Architecture
- RestAssured
- OOP
- 내부 단편화
- 동적 디스패치
- java
- Session
- 클린 아키텍처
- 메모리 단편화
- Sticky Session
- 컴포짓 패턴
- pool
- 객체 풀
- pass by reference
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함