[Java] Garbage Collection 발표 프로젝트

hyun-jin·2022년 12월 20일
0

Java

목록 보기
14/14

🙍‍♀️🙍‍♂️ 팀원 소개

조장 : 이혜수
조원 : 이슬기, 박현진, 곽신호, 김승규

📆 프로젝트 기간

2022.09.13 ~ 2022.09.23


❓ Garbage Collection란 무엇인가?


1. Garbage 란?

  • 앞으로 사용되지 않을 객체의 메모리를 의미한다.


2. Garbage Collection(SC) 란?

2-1. 자바 메모리 구조 JVM

✔️ 클래스 로더(Class Loader)

실행 엔진(Execution Engine) - Runtime Data Area에 할당된 바이트 코드를 실행시키는 주체코드를 싷행하는 방식은 2가지가 존재한다.

  • 인터프리터(Insterpreter) : 바이트 코드를 해석하여 실행하는 역할을 수행, 다만 같은 메소드라도 여러번 호출될 때 매번 새로 수행해야 한다.

  • JIT 컴파일러(Just-in-Time) : Interpreter의 단점을 해소, 반복되는 코드를 발견하여 전체 바이트 코드를 컴파일하고, 그것을 Native Code로 변경하여 사용한다.

2-2. Memory 영역

  • Heap 영역 : 동적으로 할당한 메모리 영역으로, 모든 Object타입의 데이터가 할당된다. 인스턴스 객체가 생성되는 공간으로, 이 객체가 가리키는 참조 변수가 Stack영역에 할당되게 된다.

  • Stack 영역 : 정적으로 할당한 메모리 영역이다. 원시 타입의 데이터가 값과 함께 할당되고, Heap 영역에 생성된 Object타입의 데이터의 참조변수를 할당한다.


2-2. Garbage Collection 란?

  • 자바의 메모리 관리기법으로 어플리케이션이 동적으로 할당했던 메모리영역 중 더 이상 사용하지 않는 영역을 정해진 스케줄에 의해 정리해준다.

  • GC는 Heap 메모리에서 활동하며, JVM에서 GC의 스케줄링을 담당하며 개발자가 직접 관여하지 않아도 더 이상 사용하지 않는 메모리를 제거해주는 역할을 한다.



3. GC의 원리

GC가 가능했던 건 '약한 세대 가설(week generational hypothesis)'가설 덕분이다.

  • ↓ 아래 가정을 기반으로 메모리 구조를 크게 Young Generation, Old Generation으로 물리적 공간을 나눈다.


3-1. Heap Area

  • Young Generation 공간에 새로 생성된 인스턴스들이 저장된다. EDEN 공간에는 1차적으로 저장되고, 여기서 Micor GC가 일어나서 프로그램의 어디에선가 사용되기 때문에 살아남은 인스턴스들만 Survivor Space에 저장된다.

  • Old Generation 공간에 Minor GC를 여러번 거친 인스턴스들이 저장된다. 여기서도 GC가 일어나며, Major GC라고 부른다.

Minor GC - Young 영역에서 GC가 발생하는 경우
Major GC - Old 영역에서 GC가 발생하는 경우
EDEN - 인스턴스가 생성되자 마자 저장되는 곳
Survivor - Minor GC로 Garbage를 걸러내고 살아남은 인스턴스들이 저장되는 곳



4. GC 알고리즘

4-1. Mark and Sweep Algorithm

  • Stop The World


4-2. Mark Sweep Compact Algorithm



4-3. Generation Algorithm



5. 일반적인 GC 과정

1) 새로 생성된 객체가 Eden 영역에 할당된다.
2) age- bit는 Minor GC에서 살아남을 때마다 1씩 증가하게 됩니다.

  • 시간이 지나 Heap Area의 Eden 영역에 객체가 다 쌓이게 되면 Minor GC가 한번 일어나게 되고 참조 정도에 따라 Servival0 영역으로 이동하거나 회수된다.

3) 과정이 반복되다가 Survivor 영역이 가득 차게 되면 Survivor 영역의 살아남은 객체를 다른 Survivor 영역으로 이동시킨다.

  • 계속해서 Eden영역에는 신규 객체들이 생성된다, 이렇게 또 Eden 영역에 객체가 다 쌓이게 되면 Young Generation(Eden+Servivor)영역에 있는 객체들을 비어있는 Survival1영역에 이동하고 살아남은 모든 객체들은 age가 1씩 증가한다.

4) 이러한 과정을 반복하여 계속해서 살아남은 객체는 Old영역으로 이동된다.

  • 또다시 Eden 영역에 신규 객체들로 가득 차게 되면 다시 한번 minor GC가 일어나고 Young Generation(Eden + Servivor)영역에 있는 객체들을 비어있는 Survival0으로 이동시킨 뒤 age를 1 증가시킨다. 이 과정을 계속 반복한다.

5) 객체의 생존 횟수를 카운트하기 위해 Minor GC에서 객체가 살아남은 횟수를 의미하는 age를 Object Header에 기록한다. 그리고 Minor GC 때 Object Header에 기록된 age를 보고 Promotion(이동) 여부를 결정한다.

  • 이 과정을 반복하다 보면 age bit가 특정 숫자 이상으로 되는 경우가 발생합니다. 이때 JVM에서 설정해놓은 *age bit에 도달하게 되면 오랫동안 쓰일 객체라고 판단하고 Old generation 영역으로 이동시킵니다. 이 과정을 프로모션(Promotion)이라고 합니다.
  • age bit - Minor GC에서 살아남은 횟수를 기록하는 것

6) Old Generation 영역의 메모리를 회수

  • 시간이 지나 Old영역에 할당된 메모리가 허용치를 넘게 되면, Old 영역에 있는 모든 객체들을 검사하여 참조되지 않는 객체들을 한꺼번에 삿제하는 GC가 실행된다. 이렇게 Old Generation영역의 메모리를 회수하는 GC를 Major GC라고 한다.


6. GC의 종류

6-1. Serial GC

6-2. Parallel GC

6-3. CMS(Concurrent Mark Sweep) GC

6-4. G1(Garbage First) GC

  • G1에서 FullGC가 수행되는 과정



0개의 댓글