Akashic Records

VM 분석 : Chapter 2 VM의 구조와 튜닝 -1 본문

오래된글/Articles

VM 분석 : Chapter 2 VM의 구조와 튜닝 -1

Andrew's Akashic Records 2018. 4. 19. 14:44
728x90

Chapter 2 VM의 구조와 튜닝


PLT 2.1 JAVA 메모리 영역 구조

Sun Microsystems의 자바 HotSpot VM은 힙을 3개의 영역으로 나누고 있다.

1. Permanent space : JVM 클래스와 메소드 개체를 위해 쓰인다.

2. Old object space : 만들어진지 좀 된 개체들을 위해 쓰인다.

3. New(young) object space : 새로 생성된 개체들을 위해 쓰인다. 이 영역은 다음과 같이 또 3 영역으로 나뉜다.

- Eden space : 모드 새로 생성된 개체들이 위치

- From space(Survivor space 1) : Eden 에서 Old로 가기 전에 위치

- To space(Survivor space 2) : Enden 에서 Old로 가기 전에 위치

PLT 2.2 Garbage Collection

GC(Garbage Collection)은 자바언어의 중요한 특징중의 하나다. GC는 자바 어플리케이션에서 사용하지 않는 메모리를 자동으로 수거하는 기능을 말한다. 예전의 전통적인 언어 C등의 경우 malloc, free 등을 이용해서 메모리를 할당하고, 일일이 그 메모리를 수거해줘야 했다. 그러나 Java언어에서는 GC기술을 사용함에 따라서 개발자로 하여금 메모리 관리에서부터 자유롭게 해주었다.

JVM에서의 메모리 영역 관리

Perm영역은 Code가 올라가는 부분이기 때문에, GC가 일어날 필요가 없다. Perm영역은 Code가 모두 Load되고 나면 거의 일정한 수치를 유지한다.

1. Minor GC : New(young)영역의 GC방법

Young 영역은 Eden과 두 개의 Survivor 영역으로 구성된다. Minor GC의 순서는 다음과 같다.

A. Minor GC가 발생하면 Eden과 Survivor 1영역에 있는 Alive된 개체를 Survivor 2영역으로 이동하고 Eden과 Survivor 1영역을 Clear 한다.

B. 다음 Minor GC가 발생하면 Eden과 Survivor 2영역에 있는 Alive된 개체를 Survivor 1영역으로 이동하고 Eden과 Suvivir 2영역을 Clear 한다.

C. A,B을 반복하다가 Survivor영역에 오래된 개체는 Old영역으로 이동시킨다.

Minor GC와 같은 방식을 Copy & Scavenge라고 한다. 이 방법은 매우 속도가 빠르면 작은 크기의 메모리를 Collecting하는데 매우 효과적이다. Minor GC는 자주 일어나기 때문에 이 알고리즘이 적합하다.

2. Full GC : Old 영역의 Garbage Collection을 말한다.

Full GC에 사용되는 알고리즘은 Mark & Compact라는 알고리즘을 이용한다. 이 알고리즘은 전체 객체들의 reference을 쭉 따라가다가 reference가 연결되지 않는 객체를 Mark한다. 이 작업이 끝나면 사용되지 않는 객체를 모두 Mark가 되고, 이 Mark된 객체를 삭제한다. Full GC는 매우 속도가 느리며, Full GC가 일어나는 도중에는 순간적으로 자바어플리케이션이 멈춰 버리기 때문에, Full GC가 일어나는 정도와 Full GC에 소요되는 시간은 어플리케이션의 성능과 안정성에 큰 영향을 준다.

3. Parallel GC for young generation from JDK 1.4

JDK 1.4. 부터 지원하는Parallel GC는 Minor GC를 여러 개의 Thread를 이용해서 GC를 수행하는 방법으로 하나의 Thread를 이용하는 것보다 훨씬 빨리 GC를 수행할 수 있다. 하지만 Parallel GC가 언제나 빠른 것은 아니다. 1CPU에서는 동시에 여러 개의 Thread를 실행 할 수 없기 때문에 오히려 Parallel GC가 느리다. 최소한 4CPU의 256M정도의 메모리를 가지고 있는 HW에서 Parallel GC가 유용하다.

옵션

설명

-XX:+UseParallelGC

병렬 가비지 콜렉션 사용(JDK 1.4.0 이후)

-XX:ParallelGCThreads=n

병렬 가비지 콜렉션에 사용될 쓰레드 수 지정


4. Concurrent GC for old generation from JDK 1.4

JDK 1.4부터 제공하는 Concurrent GC는 기존의 Full GC의 단점을 보완하기 위해서 Full GC에 의해서 어플리케이션의 멈춤 현상을 최소화하는 GC이다. Full GC에 소요되는 작업을 어플리케이션을 멈추고 진행하는 것이 아니라, 일부는 어플리케이션이 돌아가는 단계에서 수행하고, 최소한의 작업만을 어플리케이션이 멈췄을 때 수행하는 방법으로 어플리케이션이 멈추는 시간을 최소화한다. Concurrent GC을 사용하면서 young 영역도 병렬 GC 처리를 원한다면 –XX:+UseParNewGC 옵션을 사용하여야지 –XX:+UseParallelGC 옵션을 사용하면 안된다.

옵션

설명

- XX:+UseConcMarkSweepGC

Old 영역 동시 가비지 콜렉션 사용(JDK 1.4.0 이후)


5. Incremental GC (Train GC)

JDK 1.3에서부터 지원되는 GC방법이다. 의도는 Concurrent GC와 같이 Full GC 시점에서 어플리케이션의 멈춤을 최소화하는데 있다. Incremental GC의 작동 방법은 Minor GC가 일어날 때 마다 Old 영역을 조금씩 GC를 해서 Full GC가 발생하는 횟수나 시간을 줄이는 방법이다. 처리량이 과도할 때는 기본 GC보다 처리가 더 느리다.

옵션

설명

-Xincgc

Train GC 사용

-Xnoincgc

Train GC 미사용 (기본값)



참고 자료 : 조대협님의 JVM GC와 메모리 튜닝

728x90
Comments