티스토리 뷰

GC(Garbage Collector) ?

JAVA 개발을 하면서 Out Of Memory Error는 접할 수 밖에 없으며, 해당 에러가 운영환경에서 발생하게 되었을 때 서비스 장애로 까지 이어 질 수 있다. 때문에 메모리를 괸리해주는 GC의 개념에 대해서 이해하고, 동작 원리를 아는 것은 필수라는 생각이 든다.

 

JAVA에서 객체가 생성되면 해당 객체는 JVM의 Heap영역의 메모리를 점유 한다. 해당 객체는 현재 참조 되지 않더라도 메모리 공간을 점유 한다. 물론 메모리 공간은 한정적이다. 한정적인 메모리에 현재 사용되지 않는 객체가 점유한 공간을 재때 정리해 주지 않으면 메모리 공간이 부족해 지고, 결국은 Out Of Memory Error 가 발생 할 수 밖에 없다.

 

JAVA는 JVM을 통하여 구동된다. JAVA의 특징 중 하나로 메모리 관리를 개발자가 직접 명시적으로 수행하지 않고, JVM에서 자동으로 수행해 주며, 이와 같은 역할을 하는 프로세스를 GarbageCollector(GC)라 한다.

 

JAVA의 GC는 다음과 같은 가설을 전재로 도입되었다.

JAVA에서 GC의 도입의 전제 가설 (weak generational hypothesis)
  • 대부분의 객체는 금방 접근 불가능 상태 (unreachable)가 된다.
  • 오래된 객체에서 젋은 객체로의 참조는 아주 적게 존재한다.

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

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

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

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

 

GC의 수행 영역별 구분

GC는 수행되는 영역에 따라 두가지로 구분 할 수 있다.

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

GC의 수행영역별 구분

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

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

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

STW (Stop-The-World)
  • GC가 발생하면 JVM은 어플리케이션을 멈추고, GC를 실행하는 쓰레드만 동작하게 되고 이를 Stop-The-World 라고 한다.
  • STW가 발생하는 동안은 어플리케이션이 중지 되기 때문에 장애로 이어 질 수 있다.

 

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


 

참고 자료
- NaverD2
이상민 (https://d2.naver.com/helloworld/1329)
- 12bme
블로그 (https://12bme.tistory.com/57)
-
원영's 블로그 (https://blog.voidmainvoid.net/190)

'Web-backend > Java' 카테고리의 다른 글

Spring-boot, MyBatis 로 구성된 REST API 개발  (0) 2019.05.30
H2 Console 사용하기  (0) 2017.05.02
LAF/J 의 FTP 접속 및 파일 다운로드  (0) 2011.09.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함