일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 스프링부트
- apache
- GC
- tomcat
- java
- Refactoring
- OAuth
- 페이스북
- 스프링 부트
- Spring
- Producer
- Security
- 리팩토링
- jvm
- JPA
- 시큐리티
- 클린코드
- oauth2
- load balancing
- JWT
- g1
- 권한
- 스프링
- 페이징
- gdg
- assertj
- spring boot
- RabbitMQ
- 비동기
- clean code
Archives
- Today
- Total
허원철의 개발 블로그
Java - GC (Garbage Collection) 본문
이번 글은 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