JAVA

[Java] GC 종류별 차이

로춘남 2022. 3. 24. 13:32
728x90


GC(Garbage Collector) ?

Java로 개발을 하면서 Memory 관련 Error는 접할 수 밖에 없는 문제이며, 해당 에러가 운영환경에서 발생하였을경우 단계적으로 서비스 장애까지 이어질수 있다고한다. 그렇기때문에 메모리를 관리해주는 가비지 컬렉터. 즉, GC의 개념에 대해서 이해를 하고, 동작원리를 아는것은 중요하다.

 

Java에서 객체가 생성되면 해당 객체는 JVM의 Heap영역의 메모리를 점유하게 되고, 해당 객체는 현재 참조 되지 않더라도 메모리 공간을 점유 한다. 이때, 메모리의 공간은 한정적이기 때문에 사용하지 않는 객체가 차지한 공간을 정리해주지 않으면 메모리 공간은 부족해지고 결국은 에러가 발생 할 수 밖에 없다.

 

Java는 JVM을 통하여 작동이 되는데  Java의 특징중 하나가 메모리 관리를 개발자가 직접 시행하지 않고, JVM에서 자동으로 처리를 해주며, 이러한 역할을 과정을 바로 GC(GarbageCollector)라고 부르는 것이다. 

 

GC가 도입에는 가설이 적용되는데, 1) 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다는점.

2) 오래된 객체에서 젊은 객체로의 참조는 적게 존재한다는점 이다.

 

아래와 같이 객체를 생성하고 해당 객체의 어떤 동작을 10,000번 수행하는 반복문에서 마지막 한번을 제외 한 9,999번의 객체들은 생성 후 바로 접근 불가능 상태가 된다. 이를 unreachable 상태라고 하며, GC가 발생하지 않으면 10,000개의 객체 현재 참조 되지 않지만 메모리를 점유 하고 있다고 볼 수 있다.

for (int i = 0; i < 10000; i++) {
    TestObj obj = new TestObj();
    obj.doTest(i);
}

또 아래와 같이 객체를 생성하고 다른 메소드나 클래스에 해당 객체를 전달 후 에는 다시 참조 하지 않는 경우가 대 부분이다. 이를 오래된 객체에서 젊은 객체로의 참조는 아주 적게 발생 한다라고 말 할 수 있다.

TestObj obj = new TestObj();
obj.setValue(1);
doTest2(obj);

 

GC의 수행 영역별 구분

GC는 수행되는 영역에 따라 Minor GC와 Major GC(Full GC) 두가지로 구분 할 수 있다.

Minor GC는 Eden과 Survivor1, 2의 Young Generation 영역의 객체를 메모리에서 삭제한다. Major GC는 Minor GC과정에서 삭제되지 않고, Old Generation영역으로 옮겨진 객체 중 미사용 된다고 판단되는 객체를 메모리에서 삭제한다.

GC의 구조

GC가 발생되었을때, 이를 수행하는 과정에서 진행되는 쓰레드는 멈추고 GC를 수행하는데 쓰레드만 동작하게 되는데, 이러한 과정을 Stop - The - World라고 부른다. Stop-The-World는 경우에 따라서 시스템 장애로도 연결될 수 있기때문에 GC와는 밀접하게 관련되어 있다.(STW(Stop-The-World)가 발생하는 동안에는 애플리케이션이 중지가 되기때문에 장애로 이어질 가능성이 있음.)

메모리 영역이 크게 설정이 되어 있으면 , GC가 발생하는 횟수를 줄일 수 있지만, GC의 수행시간은 증가하기때문에 최적화가 필요 할 수 밖에 없다.

 

 

 

GC의 수행영역별 구분

GC를 이해하고자 할 때 중요한 요소가 있다.

GC가 발생하고 이를 수행하는 과정에서 진행중인 쓰레드는 멈추고 GC를 수행하는 쓰레드만 동작하게 되는 데 이를 Stop-The-World 라 부른다. 이 Stop-the-world가 경우에 따라서는 시스템 장애로 이어 질 수 있기 때문에 GC와는 떼어 놓을 수 없다.

메모리 영역이 크게 설정 되어 있으면, GC가 발생하는 횟수를 줄일 수 있지만, GC 수행 시간은 증가 하기 때문에 최적화가 필요 할 수 밖에 없는 이유이다.

 

GC 발생 시나리오

GC는 기본적으로 다음과 같은 시나리오로 동작한다.

객체가 생성되면 Eden 영역에 위치 하게 된다.

Eden영역이 가득차게 되면 Minor GC가 발생하여 참조가 없는 객체는 삭제되고, 참조 중인 객체는 Suvvivor 영역으로 이동한다.

Survivor영역이 가득차게 되면 Minor GC가 발생하고 참조가 없는 객체는 삭제되고, 참조 중인 객체는 다른 Suvvivor 영역으로 이동한다.

Survivor영역에서의 GC과정을 반복 하며, 계속 참조 중인 객체는 OLD 영역으로 이동한다.

 

Eden 영역에서 Survivor 영역으로 이동 할 때 객체가 남아있는 영역보다 큰 경우 OLD 영역으로 이동한다.

 

GC 수행 방식에 따른 종류와 변화

JVM 버전의 변화에 따라 여러가지 GC방식이 추가 되고 발전되었다. 버전별로 지원하는 GC는 차이가 존재하며, 서비스 상황에 따라 필요한 GC방삭을 JVM옵션을 통한 설정으로 사용이 가능하다.

 

GC의 종류는 다음과 같다.

 

Serial Garbage Collector

- 주로 32비트 JVM에서 돌아가는 싱글쓰레드 어플리케이션에서 사용 (별도로 지정하지 않는 경우 기본 GC)
- Minor GC 뿐 아니라 Major GC인 경우도 올스탑(stop-the-world)하는 싱글쓰레드 방식.

 

 

Parallel Collector(=Throughput Collector)

- 64비트 JVM이나 멀티 CPU 유닉스 머신에서 기본 GC로 설정되어 있음.
- Minor
GC MajorGC 모두 멀티쓰레드 사용.
- MinorGC 뿐 아니라 Major GC인 경우도 올스탑
(stop-the-world)

 

 

CMS Collector (Concurrent Mark-Sweep)

- Initial Mark 단계에서참조 상태인 객체를 짧은 시간에 Marking , 올스탑 없이 Concurrent Mark 단계에서 참조상태 객체를 확인. Remark 단계에서 변경되거나 추가된 객체를 확인. Concurrent Sweep 단계애서참조 되지 않는 객체를 정리.
- 
CPU리소스를 많이 사용, 메모리 파편화가 단점
.

 

G1 Collector (Garbage First)

- 기존 Young, Old 영역의 개념과 다른 Heap Resion 개념을 도입함.
- 하나 이상의 Resion 에서 객체를 복사해 다른 Resion으로 이동 시키는 방식.
- 
CMS와 비슷한 방식으로  동작 시작. Heap 전역적으로 Marking 하고, 가장 많은 공간이 있는 곳 부터 메모리 회수 진행. 이 부분 때문에 Garbage First 라는 이름이 붙었다.
- CMS Collector
 CPU리소스 및 메모리 파편화의 단점 해결.


 

출 처 : https://blog.ycpark.net/entry/JAVA%EC%9D%98-GC%EC%9D%98-%EC%A2%85%EB%A5%98-%EB%B0%8F-%ED%8A%B9%EC%A7%95

728x90

'JAVA' 카테고리의 다른 글

[Java] 인터페이스란?  (0) 2022.03.25
[Java] static 이란?  (2) 2022.03.24
[Java] 리플렉션(Reflection)이란?  (1) 2022.03.01
[Java] 제네릭 타입 컴파일 Generic type erasure  (0) 2022.02.24
[Java] 자바 제네릭이란? Java Generic  (0) 2022.02.24