Java의 Garbage Collection

Posted by 알 수 없는 사용자
2015. 3. 27. 16:13 프로그래밍/JAVA

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