JAVA

JVM GC(Garbage Collection) - 자바에서 메모리 관리하는 방법

Garbage Collection(GC)

Heap 영역의 오브젝트 중 stack 에서 도달 불가능한 (Unreachable) 오브젝트들은 가비지 컬렉션의 대상을 해제하여 메모리를 관리하는 것을 의미한다.

 

public class Main {
    public static void main(String[] args) {
        String url = "https://";
        url += "yaboong.github.io";
        System.out.println(url);
    }
}

1. url에 String 객체인 "https://" 주소 참조

2 "https://yaboong.github.io"이라는 String 객체를 하나 말들고 해당 주소 참조

(String은 불변 객체이므로 기존에 있던 문자에 덧붙이지 않음)

3. Unreachable 객체 즉 참조가 없는 객체가 된 "http://"은 GC를 통해서 메모리에서 해제된다.

GC 과정은 Mark and Sweep 이라고도 한다. JVM의 Garbage Collector 가 스택의 모든 변수를 스캔하면서 각각 어떤 오브젝트를 레퍼런스 하고 있는지 찾는과정이 Mark 다. Reachable 오브젝트가 레퍼런스하고 있는 오브젝트 또한 marking 한다. 첫번째 단계인 marking 작업을 위해 모든 스레드는 중단되는데 이를 stop the world 라고 부르기도 한다 그리고 나서 mark 되어있지 않은 모든 오브젝트들을 힙에서 제거하는 과정이 Sweep 이다.

 

JDK 8 이전

  • 새로 생성한 대부분의 객체는 Eden 영역에 위치한다.
  • Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동된다.
  • Eden 영역에서 GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 객체가 계속 쌓인다.
  • 하나의 Survivor 영역이 가득 차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동한다. 그리고 가득 찬 Survivor 영역은 아무 데이터도 없는 상태로 된다.
  • 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동하게 된다.

 

4가지 GC(가비지 콜렉터) 방식

1. Serial Collector

Young 영역과 Old 영역이 시리얼하게(연속적으로) 처리되며 하나의 CPU를 사용합니다.

이 처리를 수행할 때를 Stop-the-world라고 표현합니다.

콜렉션이 수행될 때 애플리케이션 수행이 정지합니다.

 

2. Parallel Collector(=Throughput Collector)

다른 CPU가 GC의 진행시간 동안 대기 상태로 남아 있는 것을 최소화

Serial Collector의 Young 영역에서 진행하는 컬렉션을 병력 방식으로 처리하여 GC의 부하를 줄이고 성능을 향상시킬 수 있습니다.

3. CMS Collector (Concurrent Mark-Sweep)

Initial Mark 단계에서참조 상태인 객체를 짧은 시간에Marking , 올스탑 없이 Concurrent Mark단계에서 참조상태 객체를 확인.

Remark단계에서 변경되거나 추가된 객체를 확인. Concurrent Sweep 단계애서참조 되지 않는 객체를 정리.

CPU리소스를 많이 사용, 메모리 파편화가 단점.

4. G1 Collector (Garbage First)

기존 Young, Old 영역의 개념과 다른 Heap Resion 개념을 도입

하나 이상의 Resion 에서 객체를 복사해 다른 Resion으로 이동 시키는 방식

Heap 전역적으로 Marking 하고, 가장 많은 공간이 있는 곳 부터 메모리 회수 진행. 이 부분 때문에 Garbage First 라는 이름이 붙었다. - CMS Collector CPU리소스 및 메모리 파편화의 단점 해결.

Reference

d2.naver.com/helloworld/1329

'JAVA' 카테고리의 다른 글

Queue 구현 해보기 (자바)  (0) 2021.05.24
Stack 구현 해보기 (자바)  (0) 2021.05.24
==, equals(), hashcode() 비교  (0) 2021.04.30
String Constant Pool 란?  (0) 2021.04.30
JVM 스택과 힙 영역 저장 되는 것들  (0) 2021.04.30