허원철의 개발 블로그

Java - GC (Garbage Collection) 본문

java

Java - GC (Garbage Collection)

허원철 2017. 3. 5. 20:48
이번 글은 JAVA에서 Garbage Collection(이하 GC)에 대한 글 입니다.


GC란?

- 메모리 관리 기법 중에 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능입니다. JVM에서는 Heap영역의 메모리를 자동으로 관리해줍니다.


GC의 중요성?

- 하드웨어와 언어가 발전하면서 효율적인 GC 알고리즘이 만들어지고 있으니.. 알아갈 필요성이 있다?
- 자동적으로 관리를 해주지만, 'stop-the-world' (GC를 실행하는 쓰레드를 제외한 모든 쓰레드가 일시적으로 멈추고, GC작업이 완료된 후에야 중단되었던 작업이 다시 시작하는 것)이 발생하여, 이를 최소화(튜닝) 하기 위해선 GC에 대해 명확히 알아야 합니다.


GC의 기본 개념

- GC를 알기에 앞서, HotSpot VM에 물리적 공간(영역)에 대해 알고 있어야 합니다.


Young Area

- 새로 생긴 객체의 대부분이 여기에 위치합니다.
- Eden Area, Survivor Area (2개)로 구성됩니다.
- Minor GC가 발생한다고 말합니다.

Old Area

- Young Area에서 살아남은 객체가 여기에 위치합니다. 
- Major GC 또는 Full GC가 발생한다고 말합니다.


GC의 종류

Young Area

1) bump-the-pointer
- Eden 영역에 마지막 객체를 캐싱 해두고, 그 다음에 생성되는 객체가 있으면 Eden에 넣기에 적당한지 판단합니다.
2) TLABs
- 멀티 스레드 환경을 고려해 Eden영역에 lock-contention으로 인한 성능 이슈를 개선한 것 입니다.

Old Area

1) Serial GC
- mark - sweep - compaction 알고리즘을 사용합니다. 
 ① mark : 객체를 식별합니다.
 ② sweep : 힙영역을 앞에서 부터 확인하여 살아 있는 것만 남깁니다.
 ③ compaction : 힙에 가장 앞부분부터 채워 객체 존재 부분과 객체 미존재 부분으로 나눕니다.
- CPU가 하나 일 때 사용하는 방식입니다.
- 성능이 떨어지기 때문에 운영서버에 적합하지 못합니다.
 
2) Parallel GC
- ThroughputGC 라고도 말합니다.
- SerialGC와 알고리즘이 같으나, 여러 쓰레드를 사용하여 더 효율적입니다.

3) Parallel Old GC
- JDK 5 update 6부터 제공합니다.
- mark - summary - compaction 알고리즘을 사용합니다. (약간 더 복잡한 단계)
 ① summary : GC를 수행한 영역에 대해서 별도로 살아 있는 객체를 식별

4) CMS GC ( Concurrent Mark Sweep )
- Low Latency GC 라고도 말합니다.
- N개의 쓰레드를 가지고 지속적인 GC을 하여 stop-the-world를 줄입니다.
- GC 과정
 ① Inital Mark : 클래스 로더에서 가장 가까운 객체 중 살아 있는 객체만 찾습니다
 ② Concurrent Mark : 방금 확인한 객체에서 참조하고 있는 객체들을 확인합니다. (다른 쓰레드와 동시에 진행)
 ③ Remark : Concurrent Mark에서 새로 추가되거나 참조가 끊긴 객체를 확인합니다.
 ④ Concurrent Sweep : GC가 발생합니다. (다른 쓰레드와 동시에 진행)
- 단점
 ① 다른 GC방식보다 메모리와 CPU를 더 많이 사용합니다.
 ② compaction단계가 기본적으로 제공하지 않습니다.

5) G1 GC
- Server Style GC 라고도 말합니다.
- JDK 7 update 4 부터 제공합니다. (JDK 6에서는 early access라고 불리며 시험 사용이 가능했습니다.)
- Memory가 4GB 이상에서 사용하는 것이 좋습니다.
- 바둑판의 각 영역의 객체를 할당하고 GC를 실행합니다. (Heap 영역에 따라 1MB ~ 32MB 사이로 대략 2000개정도로 분할 됩니다.)
- 장점
 ① 어떤 GC보다 빠릅니다.


JAVA 8 & GC

1) JDK 8 update 20부터는 String 중복제거를 해줍니다. 중복된 문자열을 식별하고 동일한 내부 문자를 가리키도록 수정 할 수 있습니다.

1
-XX : + UseStringDeduplication
cs

2) Permanent Generation (PermGem) 제거 되고 Metaspace라는 새로운 메모리 공간이 생겼습니다. 
- 기존 PermSize 및 MaxPermSize 값은 무시됩니다. (MetaspaceSize 및 MaxMetaspaceSize 추가가 됐습니다.)
- 기존의 Perm에 저장되어 문제가 있던 부분(static object가 Heap으로 옮겨져 GC 발생)을 Metaspace로 옮겨 Heap Size가 동적으로 조정되면서 개선되었다고 합니다.


참고



'java' 카테고리의 다른 글

Java - JVM Architecture  (429) 2017.03.08
Java - Compare GC  (406) 2017.03.07
Java - Optional API  (415) 2017.02.19
Java - time package(LocalTime, LocalDate, LocalDateTime,...)  (398) 2017.02.07
Java - JUnit & AssertJ  (406) 2016.12.05
Comments