"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

오늘이군

JVM 구조와 GC(Garbage Collection) 본문

삶../프로그래밍

JVM 구조와 GC(Garbage Collection)

오늘이군 2017. 5. 16. 15:42
반응형

모든 자바 어플리케이션은 JVM(Java Virtual Machine) 환경에서 작동합니다.
자바코드도 메모리에 올라와야 할 것이고 데이터도 메모리에 올라와야 합니다.


1. 메모리

코드 실행 영역은 말 그대로 자바 소스 코드가 실행되는 영역이며
데이터 저장 영역은 데이터베이스의 데이터가 아니라, 코드가 실행되면서 생성이 되는 변수, 클래스, 메서드 등이 저장되는 영역입니다.


2. 메모리 > 데이터 저장 영역

데이터 저장영역은 static, stack, heap 영역으로 구분이 됩니다.

static 영역은 프로그램의 시작부터 종료까지 메모리에 올라가 있으며 모든 프로그램에 의해 공유 됩니다.
전역변수 및 static 멤버 변수나 메소드가 저장 됩니다. 

stack 영역은 메소드(변수)가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제됩니다.
기본 자료형에 해당되는 지역변수, 매개변수 등의 데이터의 값이 저장 됩니다.

heap 영역은 사용이 불필요하다면 메모리 관리를 위해 JVM에 의해 알아서 해제됩니다.
이것이 GC(Garbage Collection) 입니다.
heap 영역에는 참조형(Reference Type)의 데이터 타입을 갖는 객체(인스턴스), 배열이 저장 됩니다.


3. 메모리 > 데이터 저장 영역 > heap area

객체가 저장되는 heap 영역은 Young 영역과 Old 영역으로 구성이 되어 있습니다.
Young 영역은 Eden / Survivor1 / Survivor2 로 구성이 되어 있으며 

4. minor GC (minor Garbage Collection)


새롭게 생성된 객체는Eden 에서 생성이 됩니다. 


이후 Eden 이 꽉차게 되면 GC 가 발생하고, 살아남은 객체는 Survivor1 영역으로 복사 됩니다. 


다시 Eden 에 GC 가 발생하면 Survivor1 에 있던 객체는 Survivor2로 이동을 합니다.
여기 까지가 Minor GC 입니다.
Minor GC 는 매우 빠르고 효율적입니다. 소요시간은 Young Generation의 크기에 따라 다르지만 1초 미만입니다.


5. MAJOR GC (MAJOR Garbage Collection)

Young영역이 모두 꽉차게 되면 Garbage Collector 는 객체들의 상태를 파악하기 위해 모든 Thread 의 실행을 잠시 멈추고
사용하지 않는 객체는 제거하고 살아있는 객체는Old 영역으로 이동하며 heap 영역을 정리합니다.

이와 같이 GC를 실행하기 위한 Thread를 제외하고 모든 Thread 의 작업이 멈추는 상태를 stop-the-world 라고 하는데 이러한 작업은 CPU에 부하를 가하게 되며 minor GC에 비해 10배 이상의 시간을 사용하기 때문에 장애로 이어질 수 있습니다.

JDK 7 이상에서 지원하는 MAJOR GC 알고리즘은 다음과 같이 있습니다.

Serial Collector (시리얼 콜렉터)
Parallel Collector (병렬 콜렉터)
Parallel Compacting Collector (병렬 콤팩팅 콜렉터)
Concurrent Mark-Sweep Collector (CMS 콜렉터)
Garbage First Collector (G1 콜렉터) 

결국 원활한 서비스를 위해서는 각 영역별로 자원을 얼마나 할당할 것은지 어떤 알고리즘을 사용할 것인지가 중요한데, GC 튜닝이라고 하면 이와 같은 Thread의 작업이 멈추는 시간을 최소한으로 줄이는 행위라고 보면 됩니다.
각 서비스마다 객체의 크기와 생존주기, 그리고 장비의 종류도 다양하기 때문에 지속적인 튜닝과 모니터링을 통해 해당 서비스에서 가장 적합한 값을 찾아야 합니다.

쉽게 생각할 수 있는 힌트는
메모리 크기가 작으면 GC 가 자주 수행되고, 
메모리 크기가 크면 GC 가 오래 수행되는 단점이 존재 할 것입니다. 



반응형

'삶.. > 프로그래밍' 카테고리의 다른 글

아키텍처  (0) 2017.05.16
JAVA  (0) 2017.05.16
객체지향  (0) 2017.05.16
공부하는 방법  (0) 2017.05.16
즐겨찾기  (0) 2017.05.16

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
Comments