Java의 Garbage Collection
Garbage Collection (GC)
: 쉽게 이야기해서 Java가 개발자 대신 사용하지 않는 객체를 자동으로 찾아 메모리에서 제거해줌으로써 메모리를 관리해주는 것이다.
■ GC를 시작하기 전 알아야 할 용어
- GC를 시작하기 앞서 "stop-the-world"라는 용어를 알아야 한다. 이것은 GC를 실행하기 위해 JVM의 애플리케이션 실행을 잠시 멈추는 것을 뜻한다. "stop-the-world"가 발생하게 되면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다. GC를 실행한 후 멈추었던 쓰레드가 다시 실행되게 된다. 어떠한 GC알고리즘을 사용하더라도 "stop-the-world"는 실행되는데 이것의 시간을 줄이는 것이 GC를 튜닝한다고 하는 것이다.
■ GC가 만들어진 2가지 전제조건
- 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다.
- 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
■ Java의 힙(Heap) 영역
영역 |
설명 |
Young |
이 영역은 Java 객체가 생성되자마자 저장되고, 생긴지 얼마 안된 객체가 저장되는 곳이다. Java 객체가 생성되면 이 영역에서 저장되다가 시간이 지남에 따라 우선순위가 낮아지면 Old 영역으로 옮겨진다. 이 영역에서 객체가 접근 불가능 상태가 되어 사라질때 Minor GC가 발생한다고 한다. |
Old |
Young 영역에서 저장되었던 객체중에 접근 불가능 상태가 되지 않는 오래된 객체가 이동되어서 저장되는 영역이다. Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC가 적게 발생한다.(기본적으로 데이터가 가득 차면 GC를 실행) 이 영역에서 객체가 사라질때 Major GC(혹은 Full GC)가 발생한다고 한다. |
Perm |
Class, Method 등의 Code등이 저장되는 영역으로 JVM에 의해서 사용된다. |
■ Minor GC
: Eden 에서 Alive 된 객체를 Survivor1 으로 이동한 후 Eden 영역을 Clear 한다.
: Eden 영역에 Alive 된 객체와 Survivor1 영역에 Alive 된 객체를 Survivor2 에 Copy 한다. Eden, Survivor1 영역을 Clear 한다.
: 객체가 생성된 시간이 오래지나면 Eden과 Survivor 영역에 있는 오래된 객체들을 Old 영역으로 이동한다.
■ Full GC (Major GC)
: Mark & Compact 알고리즘을 이용한다. 전체 객체의 Reference를 체크하여 연결되지 않는 객체를 Mark 한 후 이 Mark 된 객체를 삭제한다.
(실제로는 Compact라고 해서 Mark된 객체로 생기는 부분을 Unmark된 즉 사용하는 객체로 매꾸어 버리는 방법)
■ Full GC의 여러가지 방식
- Serial GC
- Parallel GC
- Parallel Old GC (Parallel Compacting GC)
- Concurrent Mark & Sweep GC (CMS)
- G1(Garbage First) GC
■ 주의사항
- GC를 튜닝하기 위하여 "System.gc()"라는 메소드를 코드에 직접 삽입하여 사용하려는 부분이 있는데, 이것은 절대로 하지 말아야 할 사항이다. 코드에 직접적으로 GC를 호출하게 하여 사용할 경우 응답시간이 약 5,000배 늘어나게 되어 엄청난 성능저하를 초래한다. GC의 튜닝은 각자 서비스마다의 GC 상황을 모니터링 한 후 알맞은 GC방식의 지정과 Heap 크기의 지정으로 튜닝을 하게되니 절대적으로 코드에 GC를 호출하는 일은 없어야 한다.
※ 출처
http://helloworld.naver.com/helloworld/textyle/1329
http://bcho.tistory.com/attachment/ck14.pdf
http://www.jpstory.net/2013/12/garbage-collection-in-java/
'프로그래밍 > JAVA' 카테고리의 다른 글
JSTL Core Tag (c tag) (4) | 2015.06.02 |
---|---|
Java의 Collections (List, Set, Map) 이해 (320) | 2015.04.10 |
Java의 String, StringBuffer, StringBuilder 설명 (277) | 2015.03.24 |
JAVA 첫번째 (3) | 2015.03.17 |