[JAVA] JVM의 Garbage Collector

2022. 5. 17. 22:59· Study

우리가 자바를 공부하고 설명할 때 꼭 알아야 하는 용어들은 다음과 같은 것들이 있다.

 

 

1. JVM: Java Virtual Machine

2. GC: Garbage Collector

 

 

먼저 JVM에 대해서 간단히 알아보자.

 

JVM이란 무엇인가?

 

 

JVM의 명칭은 Java Virtual Machine의 약자로, 「자바 가상머신」이라고 부른다.

 

 

JVM은 우리가 작성한 자바 프로그램이 수행되는 프로세스라 말할 수 있다.

다시 말해 java라는 명령어를 통해 어플리케이션이 수행되면, 이 JVM 위에서 애플리케이션이 동작한다.

이 JVM에서 우리가 작성한 프로그램을 찾고 실행하는 일련의 작업이 진행되는 것이다.

 

 

 

❝그렇다면 JVM이 수행하는 구체적인 행위는 무엇일까?❞

 

 

 

JVM은  운영체제의 메모리 영역에 접근하여 메모리를 관리한다.

때문에 자바의 메모리 관리는 개발자가 하지 않아도 된다.

이 때 JVM 내에서 메모리 관리를 수행하는 것을 바로 "Garbage Collector(GC)"라고 부른다.

 

 

 

 

 

 

 

GC란 무엇인가?

 

GC의 명칭은 Garbage Collector의 약자로, 「가비지 컬렉터」라고 부른다.

 

 

Garbage는 우리나나 말로 '쓰레기'라는 의미이며, 사용하고 남아 전혀 쓸모 없는 객체들이 여기에 속한다.

GC는 동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능을 한다.

 

 

 

 

 

❝동적으로 할당된 메모리는 어떤 것을 의미할까?❞

 

 

 

 

바로 자바의 Heap을 말한다.

 

 

자바의 Heap이란 동적으로 할당한 메모리 영역으로

자바의 최상의 클래스인 Object 타입의 데이터가 할당되며, Heap 영역의 Object를 가리키는 참조 변수가 Stack에 할당된다. 

 

자바의 Stack이란 정적으로 할당한 메모리 영역으로

원시 타입의 데이터가 값과 함께 할당되며, Heap 영역에 생성된 Object 타입의 데이터의 참조 값을 할당한다.

 

 

 

 

 

코드 상에서 수행되는 Stack과 Heap에 대해서 간단히 알아보자.

 

public class Main{
	public static void main(String [] args) {
		int num1 = 20;
		int num2 = 5;
		int sum = num1+num2;
		String name = "커피";
		
		System.out.println(sum);
		System.out.println(name);
	}
}

 

 

Main 메서드가 순차적으로 실행될 때, 각 변수는 선언된 순서대로 Stack에 할당된다.

String은 객체이므로 Heap 영역에 할당되고, "커피"라는 객체를 참조하는 변수가 Stack에 할당된다.

 

 

 

Main 메서드가 끝나면 pop 되면서 Stack 영역의 데이터가 날아가고,

Heap 영역의 객체 타입의 데이터만 남게 된다.  해당 객체를 Unreachable Object 라고 한다.

이러한 객체들이 Garbage Collector가 수행될 대상이 된다.

 

 

 

 

 


 

 

 

 

Garbage Collector의 기본 과정

 


1. Garbage Collector 가 Stack의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다.

2. Reachable Object가 참조하고 있는 객체도 찾아서 마킹한다.
=> Mark: 객체를 찾아서 마킹하는 과정
3. 마감되지 않은 객체를 Heap에서 제거한다.
=> Sweap: Heap에서 객체를 제거하는 과정


 

Garbage Collector 의 과정을 Mark and Sweap 라고 할 수 있다.

 

 

 

 

다음 구조를 보면 Stack의 'names' 변수는 'List' 라는 객체를 참조하고 있고, 객체 'List'는 각 String 객체들을 참조하고 있다.

그러나 '커피'는 아무런 객체를 참조하지 않는다. 따라서 이러한 객체를 Unreachable Object 라 하며,

해당 영역들이 Garbage Collector를 통해 해제되는 것이다.

 

 

 

 

 


 

 

 

"Garbage Collection은 언제 일어날까?"

 

 

 

먼저 Heap의 구조에 대해 알아보자.

 

Heap의 기본 영역

Heap은 New Generation과 New Generation 영역으로 나뉘어 있다.

 

 

 

New Generation의 세부 영역

그 중에서도 New Generation은 Eden, Survival 0, Survival 1 영역으로 나뉘어 있다.

 

 

 

1. Eden 영역에 모두 할당

먼저 새로운 객체가 생성되면 이는 Eden 영역에 할당되고,

Eden 영역의 메모리가 모두 사용되면 Garbage Collector가 발생하게 된다.

 

이 때 발생하는 Garbage Collector를 Minor GC[각주:1] 라고 한다.

 

 

 

2. Survival0 영역에 할당

Mark and Sweap 과정 후 Eden 영역에서 살아남은 객체들, 즉 Reachable 객체는 Survival 0 으로 옮겨진다.

반면 Eden 영역의 Unreachable 객체는 메모리에서 해제된다.

 

 

 

앞서 설명한 과정을 요약하면 다음과 같다.

 

 

Eden 영역 -> Survival0 영역의 이동 과정 요약

 

새로운 객체는 Eden영역에 할당되고, Eden의 메모리가 꽉 차면 GC가 발생한다.
다음으로 Mark ans Sweap 과정을 통해 살아남은 Reachable 객체들만 Survival 0 으로 옮겨진다.

 

 

 


 

 

 

1. Survival0 영역 -> Survival1 영역으로 이동

Surival0 영역의 메모리가 모두 사용되면 해당 영역에 대한 Mark and Sweap 과정이 다시 일어나게 된다.

여기에서 살아남은 객체들은 Surival1 영역으로 이동한다. 이 때 이동한 객체의 Age 값은 증가한다.

 

 

 

 

2. (새로운 객체) -> Eden 영역 -> Sutvival1 영역으로 이동

계속해서 새로운 객체가 Eden 영역에 할당되어 GC가 발생하면, 두 Survival 영역 중 객체가 들어있는 곳에 쌓이게 된다.

다시 말해 두 Survival 영역 중에 하나는 항상 비어있는 상태로 유지가 된다는 것이다.

 

 

 

 


 

 

 

1. (새로운 객체) -> Eden 영역 -> Sutvival0 영역으로 이동

Survival1 영역이 모두 찼을 경우, 해당 영역에 대해서 Mark and Sweap 과정이 일어나게 된다.

여기서 살아남은 객체는 Survival0 영역으로 이동하고, 이동한 객체의 Age 값은 증가한다.

 

 

 

 

 

2. Survival0 영역 -> Survival1 영역으로 이동

같은 방식으로 새로운 객체가 Eden 영역에 순차적으로 할당되다가 메모리가 꽉 차면 Minor GC가 일어나고,

살아남은 객체는 Age 값이 증가하면서 Survival0에서 Survival1으로 이동한다.

 

 

 

 

 

특정 값 이상의 Age -> Old Generation 영역

이 과정을 반복하면 Age 값이 계속 증가하게 된다.

이 때, Age 값이 특정 값 이상이 되면 Old Generation 영역으로 옮겨진다.

 

이러한 과정을 Promotion[각주:2] 이라 한다.

 

 

 

 

Promotion이 계속 발생하다 보면 Old Gerneration 영역이 모두 사용된다.

 

 

이 때 발생하는 Garbage Collector를 Major GC[각주:3] 라고 한다.

 

 

 

 

 

"Garbage Collector는 지금까지의 과정을 반복하면서 JVM 내에서의 메모리 관리를 수행한다."

 

 

 

 

 

그러나 우리는 Garbage Collector가 알아서 쓰레기를 처리한다 하더라도,

메모리를 효율적으로 사용하는 개발이 매우 중요하다는 것을 잊지 말자.

 

 

 

 

 

  1. Heap의 New Generation에서 발생하는 GC [본문으로]
  2. New Generation에서 Old Generation으로 이동하는 것 [본문으로]
  3. Heap의 Old Generation에서 발생하는 GC [본문으로]

'Study' 카테고리의 다른 글

[JAVA] 동기, 비동기와 멀티스레딩  (0) 2022.06.17
[JAVA] Process(프로세스)와 Thread(스레드)  (0) 2022.06.01
[JAVA] == 연산자, equals와 hashCode  (0) 2022.05.04
[JAVA] 변수의 종류  (0) 2022.04.12
THREE Paradigms  (0) 2022.03.27
'Study' 카테고리의 다른 글
  • [JAVA] 동기, 비동기와 멀티스레딩
  • [JAVA] Process(프로세스)와 Thread(스레드)
  • [JAVA] == 연산자, equals와 hashCode
  • [JAVA] 변수의 종류
jeonniu
jeonniu
주니어 개발자의 기록하는 습관 기르기.. 👩🏻‍💻
jeonniu
my records
jeonniu
전체
오늘
어제
  • 분류 전체보기 (43)
    • New (3)
    • Study (23)
    • Algorithm (2)
    • Project (2)
    • Solution (2)
    • CodeStates 45th (11)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기
  • 설정

공지사항

인기 글

태그

  • TCP/IP 4계층
  • UCP
  • @Repository
  • Spring Data JDBC
  • @Service
  • springboot
  • Java
  • aggregate
  • 아키텍처 패턴
  • data Binding
  • EC2
  • 백엔드
  • 객체지향프로그래밍
  • Long Polling
  • mysql
  • multithreading
  • AWS
  • in-memory db
  • 가비지 컬렉터
  • Synchorunous
  • 3 paradigms
  • 스프링부트
  • MVC
  • aggregate root
  • JPA
  • chat GPT
  • 컴포넌트 스캔
  • Asynchrounous
  • spring
  • 프로그래밍 패러다임

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
jeonniu
[JAVA] JVM의 Garbage Collector
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.