Article Image
Article Image
read

Heap 이란?

  • JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.
  • new 연산자로 생성되는 객체를 저장한다.
  • 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
  • 참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 GC의 대상이 된다.

객체의 생몰주기(LifeCycle)

  • Heap 내의 객체는 모든 쓰레드에서 공유된다.
  • 객체가 더 이상 사용되지 않거나 명시적으로 null 선언 시
  • 혹은 GC(Garbage Collection) 대상이 되었을 때(벤더나 jvm 옵션에 따라 GC 대상이 되는 객체는 달라질 수 있다.)
  • 객체는 소멸 된다.

Heap 메모리 구조

JVM 에서 Heap 메모리 구조는 매우 중요한다. 실체 인스턴스들이 활동하는 공간이자 Garbage Collecting의 대상이 되는 영역이기 때문이다. 다음을 통해 자세히 살펴본다.

Heap 메모리 구조

From과 To를 합쳐서 Survivor Space 라고도 부른다

Heap 영역을 크게 나누면 3가지로 나눌 수 있다.

  1. New(Young) Generation : 새로 생성된 객체를 저장 => Minor GC 대상
  2. Old Generation : 객체가 시간이 지나거나, New 영역의 한계에 도달하면 Old 로 이동 => Major GC(Full GC) 대상
  3. Permanent Generation : 클래스나 메소드의 정보 저장. Reflection 을 사용해서 동적으로 클래스를 로딩할 때 이 영역에 저장이 된다.

일단 메모리에 객체가 생성되면, Eden 영역에 객체가 지정된다. Eden 영역에 데이터가 어느 정도 쌓이면, 이 영역에 있던 객체가 어디론가 옮겨지거나 삭제된다. 이 때 옮겨가는 위치가 survivor 영역(From, To)이다. 두개의 Survivor 영역 사이에 우선 순위가 있는 것은 아니지만 이 두 개의 영역 중 한 영역은 반드시 비어 있어야 한다. 그 비어있는 영역에 Eden 영역에 있던 객체가 할당 된다.

Eden에서 survivor 둘 중 하나의 영역으로 할당 되고, 할당된 Survivor 영역이 차면, GC가 되면서 Eden 영역에 있는 객체와 꽉 찬 Survivor 영역에 있는 객체가 비어 있는 Survivor 영역으로 이동한다. 그러다가 더 큰 객체가 생성되거나, 더 이상 Young 영역에 공간이 남지 않으면 객체들은 Old 영역으로 이동하게 된다.

PermGen 영역은 JDK8 이후 큰 변경이 있었으므로 추후에 다시 살펴도록 한다.

JVM 메모리 Option

  1. -Xmx{size} : Young + Old Generation의 최대 Size
  2. -Xms{size} : Young + Old Generation의 최소 Size
  3. -XX:MaxNewSize={size} : Young Generation 의 Size
  4. -XX:NewSize={size} : Young Generation의 Size
  5. -XX:OldSize={size}: Old Generation의 사이즈
  6. -XX:NewRatio={ratio} : New Generation의 비율

GC 옵션

HotSport JVM Options MindMap CheetSheet for Java Programmers

JVM에서 GC는 크게 Minor GC와 Major GC로 나뉜다. Minor GC는 Young Generation 영역을 정리하는 GC이고, Major GC는 Old Generation 영역을 정리하는 GC이다. 그리고 Major GC는 FullGC라고도 불린다.

1. Serial Collector

  • 단일 Thread로 GC 작업 수행
  • 그냥 이러게 있었다 정도로만 알면 됨.

2. Parallel Collector

  • 복수의 Thread로 GC작업을 수행
  • “-XX:+UseParallelGC” 옵션을 사용하여 Minor GC에서 parallel collector를 활성화 할 수 있다.
  • “-XX:+UseParallelOldGC” 옵션을 사용하여 Major GC에서 parallel collector를 활성화 할 수 있다.
  • 복수의 Thread를 사용하여 GC를 수행한다.

3. CMS Collector

  • Major GC 실행시 Application 과 GC Thread가 동시에 수행된다.
  • “-XX:+UseConcMarkSweepGC” 옵션을 사용해서 활성화 할 수 있다.
  • Minor GC에서 Parallel Collector를 활성화하기 위해서는 “-XX:+UseParNewGC” 옵션을 사용해야 한다. 단 “-XX+UseParallelGC” 와 같이 사용하면 안된다.
  • Parallel Collector GC 보다는 최대 성능이 낮게 나오지만, GC로 인한 Application Thread 정지 시간을 최소화 하여 응답시간 지연을 줄이고자 하는 경우 사용된다.
  • CMS Collector에 의한 Major GC가 수행되는 동안 Application에 의해서 Old Generation 영역이 꽉차게 되면, 모든 Application Thread를 멈추고, Full GC를 수행하게 된다.

4. GC 로그 옵션

  • GC 로그 단순 정보를 보기 위하면 다음 옵션을 준다.
  • “verbose:gc -Xloggc:{로그_파일_위치} -XX:+PrintGCDetails -XX:+PrintGCTimeStamps”
  • OOME(OutOfMemoryExecption) 발생시 자동으로 힙덤프 생성 하는 옵션은 다음과 같다.
  • -XX:+HeapDumpOnOutOfmemoryError -XX:HeapDumpPath=/path

이 외의 상세 JVM 옵션과 관련된 정보는 다음의 링크에서 확인한다. JVM Options

Blog Logo

Joseph Yoon


Published

Image

엔지니어와 아티스트 사이

엔지니어와 아티스트 사이 예술과 공학 사이

Back to Overview