C. Java
JVM (java virtual machine) 구조
sfeg
2017. 7. 2. 21:35
운영체제에 상관없이 어디서든지 컴파일된 자바 클래스를 실행해준다.
자바 클래스파일 실행 -> 클래스 로더에서 읽어들임 -> 읽어들인 클래스의 데이터를 저장 -> 클래스 코드 실행
% 클래스 로더
class 파일을 실행할 준비 단계
class 파일을 실행할 준비 단계
( JVM이 수행할 클래스를 찾아서 클래스의 바이너리 데이터를 메모리에 적재. 이때 클래스를 검증(verification),
클래스 변수를 위한 메모리를 초기화해서 기본값으로 할당(preparation),
클래스의 참조를 직접참조로 변환(resolution) )
% 런타임 데이터 영역
클래스 로더에서 준비해서 여기서 이제 수행하면서 쓸 데이터들을 보관한다. 보관소는 5개다
1. 메쏘드 영역(method area)
프로그램이 수행되는 동안 클래스의 정보를 참조하는 곳
저장되는 것은 로딩된 클래스의 정보, 멤버변수정보, 메쏘드 정보, static변수(클래스변수) 등이 저장됨
이 영역은 JVM에서 실행되고 있는 모든 쓰레드(프로그램)에 의해 공유된다
JVM은 여러개의 쓰레드가 메쏘드를 정상적으로 사용하기 위한 동기화(synchronization)기법을 제공한다.
2. 스택 영역(stack area)
메소드 작업에 필요한 메모리 공간을 제공한다.
메쏘드가 호출될 때마다 스택 프레임이라는 데이터 영역이 생성 되며, 이것이 쌓여 스택을 구성한다.
메쏘드가 호출될 때마다 스택 프레임이라는 데이터 영역이 생성 되며, 이것이 쌓여 스택을 구성한다.
수행되는 메쏘드 정보, 로컬변수, 매개변수, 연산중 발생하는 임시데이터 등이 저장
위와 같은 변수들은 해당 메소드가 수행되는 동안 필요로 되며 메쏘드의 수행이 끝나면 필요 없게 된다.
즉 메쏘드가 호출될 때 필요로 되는 변수들을 스택에 저장하고, 메쏘드 실행이 끝나면 스택을 반환한다 .
JVM은 이러한 스택 영역을 실행중인 프로그램(쓰레드)에 따라 각각 구성하게 된다.
LIFO(last-in-first-out) 각 메쏘드를 위한 메모리상의 작업공간은 서로 구별되며(프레임), 언제나 호출스택의 제일 위에있는
메쏘드가 현재 실행중인 메쏘드 아래에 있는 메쏘드가 바로 위의 메쏘드를 호출한 메쏘드가 된다.
3. 힙 영역(heap area)
프로그램 상에서 데이터를 저장하기 위해 동적으로(실행시간에)할당하여 쓸 수 있는 메모리 영역
자바 프로그램은 프로그램 실행 중 new 연사자를 사용하여 객체를 동적으로 생성
이러한 객체나 배열(배열,String도 객체라고 한것이 이제 이해가 간다)을 저장한다.
이 영역도 유일한 공간이므로 여러 쓰레드가 공유한다.
더더욱 이 영역은 메모리해제를 할수 없다 오로지 쓰레기 수집가만이 가능하다.
4. Native 메쏘드 스택
native메쏘드는 자바 언어가 아닌 기존의 다른 언어에서 제공되는 메쏘드를 의미한다.
그런 메쏘드의 매개변수,지역변수 등을 저장한다.
5. PC 레지스터(register)
쓰레드가 시작할 때 생성되어 JVM이 현재 수행할 명령어의 주소를 저장한다.
% 실행 엔진
적재된 클래스의 메쏘드 내의 명령, 즉 바이트 코드를 인터프리트하여 수행한다.