JVM 구조
•
실행될 클래스 파일을 메모리에 로드 후 초기화 작업 수행
•
메소드와 클래스 변수들을 해당 메모리 영역에 배치
•
클래스로드가 끝난 후 JVM은 main 메서드를 찾아 지역변수, 객체변수, 참조변수를 스택에 쌓음
•
다음 라인을 진행하면서 상황에 맞는 작업 수행(함수 호출, 객체 할당 등)
•
Class Loader: JVM내로 클래스를 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈로써 런타임시 동적으로 클래스를 로드한다.
•
Execution Engine: Class Loader를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드를 실행한다. 이 때, Execution Engine은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
•
Garbage Collector: JVM은 Garbage Collector를 통해 메모리 관리 기능을 자동으로 수행한다. 애플리케이션이 생성한 객체의 생존 여부를 판단하여 더 이상 사용되지 않는 객체를 해제하는 방식으로 메모리를 자동 관리한다.
•
Runtime Data Areas: JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역이다. Class Loader에서 준비한 데이터들을 보관하는 저장소이다.
Method (static) Area
JVM이 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(static 변수), 생성자와 메서드를 저장하는 공간
필드 정보
•
클래스 멤버 변수 이름
•
데이터 타입
•
접근 제어자 정보
메서드 정보
•
메소드의 이름
•
리턴 타입
•
파라미터
•
접근 제어자 정보
type 정보
•
interface 인지, class 인지
•
Constant Pool (상수 풀: 문자 상수, 타입, 필드, 객체 참조)
•
static 변수
•
final class 변수
Heap area
new 키워드로 생성된 객체와 배열이 생성되는 영역이다.
메서드 영역에 로드된 클래스만 생성이 가능하고 가비지 컬렉터가 찾조되지 않는 메모리를 확인하고 제거한다.
Stack area
int a = 1 이라는 소스를 작성했다면 정수값이 할당될 수 있는 메모리 공간을 a 라 잡아두고 그 메모리영역에 값이 1이 들어간다. 즉, 스택에 메모리에 이름이 a라고 붙여주고 값이 1인 메모리 공간을 만든다.
Person p = new Person(); 을 작성했다면 Person p 는 스택영역에 생성되고 new 키워드로 생성된 Person(); 은 힙영역에 생성된다. 그리고 p는 스택 영역에 있지만 스택영역에서 힙영역의 Person()의 주소를 가지고 있다.
•
지역변수
•
파라미터
•
리턴 값 (위는 리턴 타입)
•
연산에 사용되는 임시 값 등