• 목록 (128)
    • Android (62)
    • Back-End (2)
    • Java (3)
    • Kotlin (16)
    • CS (7)
    • 개발 서적 (12)
    • 문제 풀이 (26)

최근 글

티스토리

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
MJ_94

한 우물만 파는 기술 블로그

Garbage Collection
CS

Garbage Collection

2022. 5. 25. 17:36

JVM이 구성된 JRE의 구성 요소 중 Garbage Collection은 객체를 생성한 이후에 더 이상 사용하지 않는 경우 메모리 릭을 방지하기 위하여 자동으로 메모리 해제를 수행한다. 

GC를 실행하기 위해서는 JVM 기반의 어플리케이션의 실행을 멈추는 'stop-the-world'가 발생하게 되는데, 'stop-the-world'가 발생하는 경우엔 GC를 실행하는 스레드를 제외한 나머지 스레드는 작업을 중단한다.

물론 GC를 완료하고 중단됐던 작업이 재개되지만 프로그램의 성능 최적화를 위해선 'stop-the-world'의 발생 빈도를 줄여 GC 성능 최적화가 필요하다.

JVM의 메모리는 Class, Stack, Heap, Native Method, PC 이렇게 5가지로 구성되어 있는데 GC는 Heap 영역의 메모리를 관리한다.

Garbage Collection의 대상은 아래와 같다.

1. 값이 Null인 객체
2. 특정 블럭 실행 종료 시 블록 내에서 생성된 객체
3. 부모 객체가 Null일 때, 부모 객체가 포함하고 있는 자식의 객체

그럼 일반적으로 Garbage Collection의 메모리 해제 과정은 어떻게 될까?

step 1. Marking (마킹)
- 객체가 할당된 메모리가 사용되는지 안되는지에 대한 마킹을 해둔다. 모든 객체를 하나하나 찾아다니며 구분하기 때문에 오랜 시간이 소모된다.

step 2. Normal Deletion (삭제)
- 마킹해둔 객체를 제거하고 메모리를 반환한다. Memory Allocator는 반환된 메모리 주소를 저장하고, 새로운 객체가 만들어지면 이곳에 할당한다.
  하지만 이런 작업은 메모리가 단편화되어 비효율적으로 처리될 수 있으므로 흩어진 객체들의 영역을 한 곳으로 모아주는 작업(Compacting)이 필요하다.

step 3. Compacting (압축)
- 참조되는 객체들을 한 곳으로 뭉쳐서 남는 공간을 늘려 새로운 메모리 할당 시 훨씬 빠르게 수행할 수 있다.

위 방식으로 진행되는 과정을 'Mark & Compat'이라 부른다.
하지만 모든 객체 하나하나를 탐색하는것 부터 비효율적인 알고리즘이다.

이런 비효율을 줄이기 위해 객체의 바이트 할당 시간과 할당된 바이트 수를 고려한 Weak Generational Hypothesis에 의거하여 young 영역과 old 영역으로 나누어 보관하는 알고리즘이 고안되는데

이를 'Generational Garbage Collection' 이라고 한다.

'Generational Garbage Collection'은 3가지 영역으로 나뉘게 되는데 각자 특징은 아래와 같다.

1. Young Generation
   - 새롭게 생성된 객체들이 상주하는 곳으로 대부분의 객체는 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 이 영역에서 생성되고 사라진다. 해당 영역에서 객체가 메모리에서 해제되면 Minor GC가 발생했다고 한다.

2. Old Generation
   - 위처럼 금방 접근 불가능 상태가 되지 않고, 오랜 시간 동안 메모리에 남아 있던 객체들이 복사되는 영역이다.
     대부분 Young 영역보다 크게 할당되어 있고, 크기가 큰 만큼 GC가 Young 영역에 비해 적게 발생한다.
     해당 영역에서 객체가 메모리에서 해제되면 Major GC가 발생했다고 한다.

3. Permanent
   - Method Area라고 불리기도 하는 이 영역은 JVM이 클래스들과 메소드들을 구분하기 위한 메타데이터들을 포함하고 있다.
     단, JDK8부터는 MetaSpace로 교체되었다.

 

참고 자료

https://d2.naver.com/helloworld/1329

저작자표시 비영리 변경금지 (새창열림)

'CS' 카테고리의 다른 글

객체 지향 프로그래밍  (0) 2022.05.26
Process와 Thread  (0) 2022.05.17
소프트웨어 개발방법론  (0) 2022.01.20
임계 영역 동시접근 해결 방안  (0) 2021.12.21
임계 구역과 경쟁 상태  (0) 2021.12.21
    'CS' 카테고리의 다른 글
    • 객체 지향 프로그래밍
    • Process와 Thread
    • 소프트웨어 개발방법론
    • 임계 영역 동시접근 해결 방안
    MJ_94
    MJ_94
    안드로이드, 개발 관련 기술 블로그

    티스토리툴바