본문 바로가기
Language/Java

[Java] GC - Garbage Collector

by hongdor 2023. 4. 10.
728x90

Learn Java - Dev.java

 

Learn Java - Dev.java

Copyright © 2023 Oracle and/or its affiliates. All rights reserved. Terms of Use | Privacy | Trademarks

dev.java

java 홈페이지를 보면 java에 관련된 정보가 정리되어 있다

 

 

Garbage Collection in Java Overview - Dev.java

 

Garbage Collection in Java Overview - Dev.java

Understanding the key aspects of how garbage collection works in Java and how to tune garbage collection.

dev.java

그 중 GC 관련 부분에서 개요 정도인

  1. Introduction to Garbage Collection
  2. Garbage collection in java

를 살펴 봤다.

 

 

 

Introduction to Garbage Collection

메모리 운영

class HelloWorld{
    String message;
    printHelloMessage(String name){
        message = "Hello " + name;//New String instance "message" created
        print(message);
    } //reference to message is lost once scope leaves method
}
  • 위 코드에서 printHelloMessage() 가 실행될 때마다 새로운 문자열이 message에 할당된다.
  • 메모리 관리를 해주지 않으면 메모리가 모자라게 될 것이다.
  • C, C++은 free, delete 호출로 직접 메모리 관리를 한다.
  • 하지만 개발자들이 메모리를 직접 관리하는 것은 번거롭고 어렵다.
  • 그래서 현대 대부분의 프로그래밍 언어는 garbage collector를 통해 자동으로 메모리를 관리한다.

 

Java의 메모리 운영

  • java에서 JVM의 일부분인 GC(Garbage collector)로 메모리를 관리한다
  • JVM에서 GC는 백그라운드 프로세스 이다.
  • 주기적으로 사용되지 않는 object를 제거한다.
  • 그리고 살아있는 object들을 재구성하여 메모리를 효율적으로 사용한다.

 

 

 

Garbage collection in java

GC types

  1. Serial Garbage Collector
    • 싱글 스레드로 동작한다.
    • 대체로 멈춰 있고 적은 리소스를 사용한다.
    • single processor 시스템에 적합하다
  2. Parallel Garbage Collector
    • Serial Garbage Collector와 비슷하다.
    • 하지만 멀티 스레드를 사용한다.
  3. Concurrent Mark Sweep (CMS) Garbage Collector
    • (Deprecated in JDK 9, Removed in JDK 14)
    • GC로 인해 JVM이 멈추는 시간을 줄였다
  4. Garbage First (G1) Garbage Collector
    • (Default since JDK 9)
    • CMS를 개선해서 대체 하였다.
    • 많은 메모리에 접근해야하는 멀티 프로세서에 적합하다.
  5. ZGC
    • (Experimental in JDK 11, Production in JDK 15)
    • 테라바이트 heap을 가진 application까지 확장 가능한 초저지연 GC이다.
    • ZGC는 다른 GC와 동작방식이 다르다
      (참고 : Deep-dive of ZGC's Architecture - Dev.java)

Heap Memory

Heap 메모리는 object의 “나이”에 따라 여러 영역으로 구분된다.

영역의 개수나 타입은 GC의 구현마다 다르다

  • Generational Garbage Collection
    • java의 대부분 GC에서 사용하는 방법이다.
    • 대부분 객체들의 수명이 짧다는 것을 이용하도록 설계됐다.
    • young & old 세대로 구분한다.
    • 객체는 young 세대에서 시작한다. GC는 주기적으로 young 세대의 객체들이 참조되는지 확인한다.
    • 객체가 살아남아 충분히 오래 됐다면 old 세대로 복사되고, 확인 주기가 길어진다.
  • Generations
    • Young Space
      • Eden Space
        • 첫 GC까지 여기에 저장된다
      • Survivor Spaces
        • 첫 GC 이후 살아남으면 여기로 복사된다.
        • GC는 보통 여러개의 Survivor Space들을 가지고 있다.
        • 목적은 새 survivor 영역으로 복사 후 이전 survivor 영역을 삭제하여
          GC의 효율성을 향상 시키기 위함이다.
    • Old Region
      • 충분히 살아 남은 객체들은 old region으로 옮겨진다.
      • GC가 자주 확인하지 않게 된다.
    • Permanent/Metaspace Region
      • JVM 메타데이터, core system classes 등 사라지면 안되는 객체들이 저장된다

Garbage Collection Process

상위 계층에서 GC는 3가지 단계를 가진다.

mark, sweep, compaction

GC 구현에 따라 추가적인 하위 단계를 가질 수도 있다.

  • Mark
    • 객체가 생성될때 1bit 마킹 값이 0으로 설정된다.
    • 마킹 값은 객체가 참조되는지 여부이다.
    • GC가 객체 그래프를 따라가며 객체에 마킹 값을 1로 설정한다.
    • 그래프는 root 오브젝트부터 시작하며, static 변수, 자바 스레드, JNI 등이 root가 될 수 있다.
  • Sweep
    • 이 단계 동안 마킹 값이 0 인 객체들은 제거된다
  • Compaction
    • 최종 단계로, 객체들이 살아남아 특정 조건을 만족하면 다음 세대(지역)으로 옮기거나 복사한다.

 

  • Garbage Collection Pause
    • GC가 동작하는 동안 JVM은 멈춘다.
    • Heap 메모리는 thread safe하지 않기 때문이다.
    • 객체들을 삭제하고, 옮기고 복사하는 동안 에러가 발생하는 것을 막기 위해서 JVM이 멈춘다.
  • Types of Garbage Collections
    • Minor garbage collections
      •  heap 메모리의 young regions만 검사한다. 자주 실행된다.
    • Major garbage collections
      • heap 메모리의 young & old regions 모두 검사한다.
      • minor 보다 덜 실행된다
      • JVM의 특정 조건에의해 실행되기도 한다. (ex. heap 메모리의 몇 % 이상 사용 시)

 

결론(내 생각)

1. GC는 heap 공간을 young, old 로 나눈다

2. GC는 Mark, Sweep, Compaction 프로세스를 거치며 young -> old 로 살아남은 객체들을 이동시킨다

3. GC가 동작하는 동안 JVM은 멈춘다

728x90

'Language > Java' 카테고리의 다른 글

[Java] JVM - Java virtual machine  (0) 2023.04.10

댓글