티스토리 뷰
가비지 컬렉션(이하 GC)
GC 의 과정
- GC에 대해서 알아보기전 알아야 용어가 있다. 바로 stop-the-world이다. stop-the-world란 GC를 실행하기 위해 JVM이 어플리케이션 실행을 멈추는 것이다. stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다.
대게의 경우 GC 튜닝이란 이 stop-the-world 시간을 줄이는 것이다. 자바는 프로그램 코드에서 메모리를 명시적으로 해제하지 않는다. 가끔 명시적으로 해제하려고 해당 객체를
null
로 지정하거나System.gc()
메서드를 호출하는 개발자가 있다.null
로 지정하는 것은 큰 문제가 안되지만System.gc()
메서드를 호출하는 것은 시스템의 성능에 큰 영향을 끼치므로 자제 해야 된다.오라클의 HotSpot VM에서는 크게 2개의 물리적 공간으로 나뉜다. Young 영역과 Old 영역이다.
1. Young 영역(Yong Generation 영역)
- 새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 많은 객체가 여기서 생성되었다가 사라진다. 이 영역에서 객체가 사라질 때 Minor GC가 발생한다고 한다.
2. Old 영역(Old Generation 영역)
- 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당되며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다. 이 영역에서 객체가 사라질 때 Major GC(혹은 Full GC)가 발생한다고 한다.
- 새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 많은 객체가 여기서 생성되었다가 사라진다. 이 영역에서 객체가 사라질 때 Minor GC가 발생한다고 한다.
- 위 그림의 Permanent Generation 영역(이하 Perm 영역)은 Method Area라고도 한다. 객체나 억류(intern)된 문자열 정보를 저장하는 곳이며, Old 영역에서 살아남은 객체가 영원히 남아 있는 곳은 절대 아니다. 이 영역에서 GC가 발생할 수도 있는데 여기서 GC가 발생해도 Major GC의 횟수에 포함된다.
Young 영역의 구성
- Young 영역은 3개의 영역으로 나뉜다.
- Eden 영역
- Survivor 영역(2개)
Survivor 영역이 2개이기 때문에 총 3개의 영역으로 나뉜다. 각 영역의 처리 절차 순서를 기술하면 다음과 같다.
- 새로 생성한 대부분의 객체는 Eden 영역에 위치한다.
- Eden 영역에서 GC가 한번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동된다.
- Eden 영역에서 GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 객체가 계속 쌓인다.
- 하나의 Survivor 영역이 가득차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동한다. 그리고 가득 찬 Survivor 영역은 아무 데이터도 없는 상태로 만든다.
- 이 과정은 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동하게 된다.
- 이 절차를 확인해 보면 알겠지만 Survivor 영역 중 하나는 반드시 비어 있는 상태로 남아 있어야 한다. 만약 두 Survivor 영역에 모두 데이터가 존재하거나, 두 영역 모두 사용량이 0이라면 정상적인 상황이 아니라고 생각된다.
Eden 영역에 최초로 객체가 만들어지고, Survivor 영역을 통해서 Old 영역으로 오래 살아남은 객체가 이동한다는 사실은 꼭 기억하자!!
출처 : hello naver(http://d2.naver.com/helloworld/1329)
'Java' 카테고리의 다른 글
static과 final의 사용 (0) | 2017.06.28 |
---|---|
자바7의 몇 가지 특징 (0) | 2017.03.30 |
JAVA8에 대해 알아보자(2) (0) | 2017.03.29 |
JAVA8에 대해 알아보자(1) (0) | 2017.03.29 |
jvm 메모리 (0) | 2017.03.29 |