자바의 프로그램의 실행 구조를 살펴보면,
- 자바 소스파일은 자바 컴파일러에 의해 바이트 코드(class 파일)로 변환된다.
- 바이트 코드를 JVM에서 읽어들인 다음
- Class Loader를 통해 JVM Runtime Data Area로 로딩하게 된다.
- 로딩된 바이트코드들을 Execution Engine에서 명령어 단위로 읽어(해석)서 실행한다.
Garbage Collector는 힙메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거한다. 이때 GC가 제거하는 시간은 언제인지 정확히 알 수 없다. GC역할을 수행하는 스레드를 제외한 나머지 모든 스레드들은 일시정지 상태가 된다. GC의 대상으로는 Heap area와 Method area가 있다.
- Method area : 모든 쓰레드가 공유하는 메모리 영역으로 메소드 영역은 클래스 ,인터페이스, 메소드, 필드, Static 변수등의 바이트 코드를 보관한다.
- Heap area : 모든 쓰레드가 공유하는 메모리 영역이며, new 키워드로 생성된 인스턴스와 배열 객체가 생성되는 영역이다.
Heap area는 GC를 효율적으로 관리하기 위해 세가지 영역으로 나누었다.
Young Generation 영역은 자바 객체가 생긴지 얼마 안됐을때 저장되는 공간이며, Heap 영역에 처음 객체가 생성되면 Eden영역에 할당된다. 그후 데이터가 Eden에 쌓이다 보면 참조 정도에 따라 Servivor영역으로 이동한다.
Young Generation 영역이 차면 참조정도에 따라 Tenured Generation 역역으로 이동되고 Old 영역에 할당된 메모리가 허용치를 넘게되면 Old 영역의 모든 객체들중 참조되지 않는 객체들을 전부 삭제하는 GC가 실행된다.(Stop-the-World)
- Stack area : 메서드 호출시 각각의 스택 프레임을 생성하고, 그 각각의 프레임 안에 메서드가 사용되는 값들을 저장하고 호출된 메서드의 지역변수, 파라미터, 리턴값과 연산에 사용되는 임시 값 등이 생성된다. 메서드의 수행이 끝나면 프레임별로 삭제한다.
- PC Register : 쓰레드가 시작될때 생성되는 영역으로 쓰레드가 실행해야될 명령들과 주소값을 저장한다.
- Native Method Stack : 자바가 아닌 다른 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.
참고자료
'자바' 카테고리의 다른 글
[자바] Tree Set 개념 및 활용 (0) | 2023.01.28 |
---|---|
[자바] Map과 Iterator (0) | 2023.01.28 |
[자바] Iterator, ListIterator 개념 및 사용법 (0) | 2023.01.28 |
[자바] static 메모리 (0) | 2023.01.20 |
[자바] 기본형 매개변수와 참조형 매개변수 (객체지향) (0) | 2023.01.19 |