memostack
article thumbnail
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.tistory.com/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형

GC (Garbage Collector)

JVM에는 메모리를 자동으로 관리해주는 특징이 있는데, 이 역할을 Garbage Collector(가비지 콜렉터)이 한다.

  • 정확히는 JVM 메모리 중 Heap 영역에서 사용하지 않는 객체를 삭제하여 관리해줌

 

Stop The World

GC에는 stop-the-world 라는 것이 존재하여, 메모리가 관리되는 동안 Java Application이 멈추는 현상을 말한다.

  • stop-the-world가 발생하는 동안 GC 스레드를 제외한 모든 스레드가 멈춤

stop-the-world가 발생하는 시간이 줄이기 위해 JVM 튜닝을 하곤하는데, 튜닝을 위해서는 JVM GC에 대해 살펴볼 필요가 있다.

 

일반적인 GC 구조

일반적인 GC 구조는 Young GenerationOld Generation으로 나눠진다.

  • 일반적이라는 말을 쓴 이유는 JVM GC 종류 중 G1GC는 아래 구조와 다른 구조를 가지기 때문
  • G1GC는 young, old, survivor 영역이 2차원 바둑판 형태로 부분적으로 나눠져있는 구조를 가짐

일반적인 GC 구조

Permanent Generation은 Java 8 이상부터는 제거되었기 때문에, Young/Old Generation에 집중해서 살펴본다.

 

Young Generation

Young Generation은 크게 3가지 영역으로 나눠진다.

  • Eden 영역 1개, Survivor 영역 2개
  • Young 영역에서 발생하는 GC를 Minor GC라고 함

 

Eden(에덴) 영역

  • 새롭게 생성된 객체가 위치하는 공간
  • Eden 영역이 꽉 차면, GC가 발생하면서 Mark & Sweep 과정이 일어난다.
    • 접근할 수 없는 객체(unreachable object)가 제거 됨
  • 이때, 발생하는 GC를 Minor GC라고 함
  • 아직 사용중인 객체는 Survivor 영역으로 이동하며, Eden 영역은 비워진다.

 

Survivor 영역

  • 또 다시 Eden 영역이 꽉 차게 되면, GC가 발생하면서 Eden과 Survivor 영역에 접근 할 수 없는 객체를 제거한다.
  • 나머지 살아남은 객체는 다른 Survivor 영역으로 이동하게 된다.
  • 이때, 다른 Survivor 영역으로 이동한 객체는 age 값이 증가한다.
  • 계속해서 살아남은 객체들은 2개의 Survivor 영역을 이동하면서, 특정 age 값을 넘어가는 경우 Old Generation으로 이동하게 된다.
    • 이 과정을 promotion이라고 함

 

Old Generation

Young 영역보다 크기 때문에 GC가 적게 발생하고, 시간은 오래걸린다.

  • 크기가 크니깐 그만큼 객체를 더 많이 가질 수 있기 때문에 꽉 차는데 오래걸림. 반대로 제거할때는 오래걸림

 

Old 영역에서 발생하는 GC를 Major GC라고 함

 

Young 영역의 Survivor 영역에서 살아남은 객체들이 Old Generation에 위치하게 된다.

 

Permanent Generation

Permanent 영역은 Java8부터는 사라지고, Mataspace 영역으로 전환되었다.

 

Java 7

<----- Java Heap -----> <-- Perm --> <--- Native Memory --->
+------+----+----+-----+-----------+--------+--------------+
| Eden | S0 | S1 | Old | Permanent | C Heap | Thread Stack |
+------+----+----+-----+-----------+--------+--------------+
      
S0: Survivor 0
S1: Survivor 1

 

Java 8+

<----- Java Heap -----> <--------- Native Memory --------->
+------+----+----+-----+-----------+--------+--------------+
| Eden | S0 | S1 | Old | Metaspace | C Heap | Thread Stack |
+------+----+----+-----+-----------+--------+--------------+

 

GC 종류와 상세한 동작 과정은 아래 내용 참고

2021/03/07 - [Language/JAVA] - JVM GC 동작 순서와 GC 종류(Serial / Parallel / CMS / G1 GC )

 

JVM GC 동작 순서와 GC 종류(Serial / Parallel / CMS / G1 GC )

JVM GC 동작 순서 요약하면 GC 동작은 아래 3 STEP으로 나눠진다. Heap 영역에 존재하는 객체들에 대해 접근 가능한지 확인한다. GC Root 에서 부터 시작하여 참조값을 따라가며 접근 가능한 객체들에 Ma

memostack.tistory.com

 

관련 글

2021/03/07 - [Language/JAVA] - JVM 메모리 (Runtime Data Area)

 

JVM 메모리 (Runtime Data Area)

Runtime Data Area JVM 메모리를 뜻함 Runtime Data Area 는 5개 영역으로 나눠짐 Method Area , Heap , Stack , PC Register , Native Method Area Method Area 와 Heap 은 모든 스레드가 공유하는 공간 Stack ,..

memostack.tistory.com

 

반응형
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.tistory.com/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
profile

memostack

@bluemiv_mm

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