Yeji's Tech Notes
article thumbnail
반응형

가비지 컬렉터(Garbage Collector)란?

가비지 컬렉터는 사용되지 않는 메모리를 대신 회수해주는 프로세스 입니다. 가비지 컬레션은 JVM 힙 공간에서 사용할 수 있는 모든 객체를 추적하고 사용하지 않는 객체들은 제거합니다.

가비지 컬렉터는 기본적으로 Mark and Sweep 두가지 단계로 동작합니다.

Mark - 가비지 컬렉터에서 사용 중인 메모리와 사용하지 않는 메모리를 식별

Sweep - Mark에서 확인한 사용하지 않는 메모리를 제거

사용되지 않는 메모리 공간은 GC에서 자동으로 처리되므로 molloc/free의 별도 메모리 할당,해제 처리를 하지 않아도 됩니다.

 

C언어 같은 경우에는 malloc, free를 통해 개발자가 직접 메모리 공간할당을 합니다.

https://www.geeksforgeeks.org/dynamic-memory-allocation-in-c-using-malloc-calloc-free-and-realloc/

 

Dynamic Memory Allocation in C using malloc(), calloc(), free() and realloc() - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

힙(Heap)영역 구조

GC 동작원리에 설명하기에 앞서, GC가 관리하는 힙영역의 구조에 대해서 설명드리겠습니다.

힙영역은 크게 3가지 영역 Young Generation, Old(Tenured) Generation, Permanent Generation으로 나뉩니다.

Young Generation

객체가 생성되는 시점에 맨 처음 할당되는 곳입니다. Young Generation이 가득차게되면, minorGC가 동작하게 됩니다.

MinorGC에서는 높은 확률로 객체가 삭제되어 최적화 될 수 있습니다.  몇몇 살아남은 객체들은 oldGeneration으로 이동하게 됩니다.

 

Old Generation

Old Generation영역은 오래 생존한 객체를 저장하고 있습니다. Young Generation영역에서 Eden영역에서 Survivor0-1영역으로 이동될때, 각 객체마다 age가 부과되는데 개체에 대한 임계값이 설정되고 이 임계값이 충족되면 Old Generation영역으로 이동하게 됩니다.

이때 MajorGC가 발생되어 이동하게 됩니다.

 

Permanent Generation

Permanent Generation영역은 JVM에서 응용 프로그램에 사용되는 클래스, 메서드를 설명하는데 필요한 메타데이터가 포함되고 있습니다. 해당 영역은 응용프로그램에서 사용중인 클래스를 기준으로 런타임에 JVM에 의해 채워집니다. 또한 javaSE 라이브러리 클래스 및 메서드를 여기에 저장할 수 있습니다. 

 

더보기

* Java8 이전에 존재하던 Permanent Generation *

해당 영역은 Java8이후로 Perm영역(Permanent Generation)이 제거되고, Metaspace영역이 추가되었습니다. 

 

아래 링크에 자세한 설명이 나와있습니다.

https://johngrib.github.io/wiki/java8-why-permgen-removed/

 

JDK 8에서 Perm 영역은 왜 삭제됐을까

 

johngrib.github.io

 

GC(Garbage Collector) 프로세스

이제 힙이 어떻게 분리되어있는지 이해했으므로 이러한 공간이 정확히 어떻게 상호 작용하는지 살펴보도록 하겠습니다. 다음 그림은 JVM의 개체 할당 및 에이징 프로세스를 보여 줍니다.

 

 

1. 객체 할당

먼저, 모든 새 개체가 eden영역에 할당됩니다. 두 survivor영역은 모두 비어있습니다.

Object Allocation

 

 

2. eden영역이 가득참

eden 영역이 가득차게되면, minor GC가 시작됩니다.

 

 

3. eden영역에서 survivor로 이동

참조된 객체가 survivor0영역으로 이동됩니다. 참조되지 않은 객체는 eden영역에서 지워지면서 삭제됩니다.

이때, eden영역에서 survivor영역으로 이동되는 객체들은 age가 부과됩니다.

 

 

4. eden영역이 또 한번 가득찼을 경우

eden영역이 또 한번 가득찼을 경우, survivor영역으로 이동하게 됩니다. 이때 알아야 될 것이 survivor영역은 무조건 한공간만 차있어야됩니다.  또한 기존에 있던 survivor0영역에 있던 객체들도 참조되지 않은 객체들은 삭제되고 참조되지 않은 객체들은 survivor1영역으로 옮겨가게 됩니다. eden영역에서 -> survivor1, survivor0 -> survivor1로 이동된 모든 객체들은 age가 올라갑니다.

 

 

5. age가 임계값에 도달했을 경우

이제 위와 같은 작업을 반복하면 오래된 개체가 임계값(31이라는 가정)에 도달하면 YoungGeneration에서 OldGeneration으로 

이동하게 됩니다. 이와 같이 Young Generation에서 Old Generation으로 이동하는 과정을 Promotion이라하며, MajorGC가 

발생하는 경우입니다.

 

 

6. Old Generation마저 가득찼을 경우

마지막으로 Old Generation까지 찼을 경우에는 Stop the World가 발생합니다.

Stop the World가 발생하게 되면 GC가 완료될 때까지 모든 응용 프로그램의 스레드가 중지됩니다. GC가 동작을 마쳐야 비로소 모든 응용프로그램이 정상적으로 돌아옵니다.

 

 

면접대비 가비지 컬렉터 내용정리

가비지 컬렉터란?

가비지 컬렉터는 Heap 메모리에서 동작하며, 사용 중인 개체와 사용되지 않는 개체를 식별하고 사용되지 않는 개체를 삭제하는 프로세스입니다. 

가비지 컬렉터의 장, 단점

장점

- GC에서 자동으로 메모리공간을 관리해줘서 따로 관리할 필요가 없음

- Dangling Pointer 처리 오버헤드 없음

- 자동 메모리 누수 관리

 

Dangling Pointer (댕글링 포인터) : 해제된 메모리 영역을 가리키고 있는 포인터

 

단점

- JVM은 개체 참조 생성/삭제를 추적해야 하므로 이 작업에서는 기존 애플리케이션보다 더 많은 CPU가 필요함. 대용량 처리시 성능 저하 발생

- 개발자가 CPU스케쥴링 시간을 제어할 수 없음

- 일부 GC를 구현하면 응용 프로그램이 비정상 종료될 수 있음

- 자동화된 메모리 관리는 적절한 수동 메모리 할당,해제 만큼 효율적이지 않음

 

가비지 컬렉터의 동작원리

Java에서 새로운 객체가 생성될 때 Eden영역에 들어가게 됩니다. Eden영역이 가득찼을 경우 MarkandSweep과정을 통해

Survivor영역으로 옮겨지는데 이때 옮긴 객체마다 age가 생깁니다. Eden영역이 가득차서 MarkandSweep을 통해 Survivor영역으로 옮기는 과정이 반복되면 age도 계속증가하면서 임계값까지 도달하는 객체가 생기면 OldGeneration으로 옮겨지게 됩니다. OldGeneration영역마저 가득차게되면 StopTheWorld가 발생하면서 GC를 제외한 모든 스레드가 중단되고, GC가 작업을 완료하게되면 다시 프로그램이 정상적으로 수행됩니다.

 

 

 

참고문서

https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

 

Java Garbage Collection Basics

Java Overview Java is a programming language and computing platform first released by Sun Microsystems in 1995. It is the underlying technology that powers Java programs including utilities, games, and business applications. Java runs on more than 850 mill

www.oracle.com

 

 

반응형
profile

Yeji's Tech Notes

@Jop

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!