조장 : 이혜수
조원 : 이슬기, 박현진, 곽신호, 김승규
2022.09.13 ~ 2022.09.23
실행 엔진(Execution Engine) - Runtime Data Area에 할당된 바이트 코드를 실행시키는 주체코드를 싷행하는 방식은 2가지가 존재한다.
인터프리터(Insterpreter)
: 바이트 코드를 해석하여 실행하는 역할을 수행, 다만 같은 메소드라도 여러번 호출될 때 매번 새로 수행해야 한다.
JIT 컴파일러(Just-in-Time)
: Interpreter의 단점을 해소, 반복되는 코드를 발견하여 전체 바이트 코드를 컴파일하고, 그것을 Native Code로 변경하여 사용한다.
Heap 영역 : 동적으로 할당한 메모리 영역으로, 모든 Object타입의 데이터가 할당된다. 인스턴스 객체가 생성되는 공간으로, 이 객체가 가리키는 참조 변수가 Stack영역에 할당되게 된다.
Stack 영역 : 정적으로 할당한 메모리 영역이다. 원시 타입의 데이터가 값과 함께 할당되고, Heap 영역에 생성된 Object타입의 데이터의 참조변수를 할당한다.
자바의 메모리 관리기법으로 어플리케이션이 동적으로 할당했던 메모리영역 중 더 이상 사용하지 않는 영역을 정해진 스케줄에 의해 정리해준다.
GC는 Heap 메모리에서 활동하며, JVM에서 GC의 스케줄링을 담당하며 개발자가 직접 관여하지 않아도 더 이상 사용하지 않는 메모리를 제거해주는 역할을 한다.
GC가 가능했던 건 '약한 세대 가설(week generational hypothesis)'가설 덕분이다.
Young Generation 공간에 새로 생성된 인스턴스들이 저장된다. EDEN
공간에는 1차적으로 저장되고, 여기서 Micor GC
가 일어나서 프로그램의 어디에선가 사용되기 때문에 살아남은 인스턴스들만 Survivor Space
에 저장된다.
Old Generation 공간에 Minor GC를 여러번 거친 인스턴스들이 저장된다. 여기서도 GC가 일어나며, Major GC
라고 부른다.
Minor GC
- Young 영역에서 GC가 발생하는 경우
Major GC
- Old 영역에서 GC가 발생하는 경우
EDEN
- 인스턴스가 생성되자 마자 저장되는 곳
Survivor
- Minor GC로 Garbage를 걸러내고 살아남은 인스턴스들이 저장되는 곳
1) 새로 생성된 객체가 Eden 영역에 할당된다.
2) age- bit는 Minor GC에서 살아남을 때마다 1씩 증가하게 됩니다.
3) 과정이 반복되다가 Survivor 영역이 가득 차게 되면 Survivor 영역의 살아남은 객체를 다른 Survivor 영역으로 이동시킨다.
4) 이러한 과정을 반복하여 계속해서 살아남은 객체는 Old영역으로 이동된다.
5) 객체의 생존 횟수를 카운트하기 위해 Minor GC에서 객체가 살아남은 횟수를 의미하는 age를 Object Header에 기록한다. 그리고 Minor GC 때 Object Header에 기록된 age를 보고 Promotion(이동) 여부를 결정한다.
age bit
- Minor GC에서 살아남은 횟수를 기록하는 것6) Old Generation 영역의 메모리를 회수