본문 바로가기

Programming/JAVA

JVM 메모리 구조



* 클래스 로더
-JAM
이 수행할 클래스를 찾아서 클래스의 바이너리 데이터를 메모리에 적재
-.class 파일을 JVM에 로딩하는 것, 즉 파일에서 메모리로 로드하는 것

-
이때 클래스를 검증하고 클래스 변수를 위한 메모리를 초기화해서 기본값으로 할당한다
클래스의 참조를 직접참조로 변환한다.

* 런타임 데이터 영역
-
클래스 로더에서 준비해서 여기서 이제 수행하면서 쓸 데이터를 보관한다.
1.
메소드 영역
클래스의 정보(클래스 형정보)를 저장하고 프로그램이 수행되는 동안 클래스의 정보(클래스 형정보) 참조하는곳
저장되는 것은 로딩된 클래스의 정보, 멤버변수정보, 메서드 정보 ,static 변수(클래스변수),상수
Import된 클래스들이 로드된 곳
이 영역은 JVM에서 실행되고 있는 모든 쓰레드(프로그램)에 의해 공유된다
JVM
은 여러 개의 쓰레드가 메소드를 정상적으로 사용하기 위한 동기화 기법을 제공한다
2.
힙 영역
프로그램 상에서 데이터를 저장하기 위해 동적으로(실행시간에)할당하여 쓸수 있는 메모리영역
자바 프로그램은 프로그램 실행 new 연산자를 사용하여 객체를 동적으로 생성(단 메소드 영역에 로드된 클래스만 생성가능)
이 영역도 유일한 공간으로 여러 쓰레드가 공유한다.
더더욱 이영역은 메모리해체를 할수 없다 오로지 쓰레기 수집가만이 가능한다
메소드영역의 클래스 형정보를 참고로해서 인스턴스를 생성하는곳이다.
3. 스택영역
메소드가 호출될때마다 스택 프레임이라는 데이터 영역이 생성되며 , 이것이 쌓여 스택을 구성한다.
수행되는 메소드 정보, 로컬변수,매개변수,연산중 발생하는 임시데이터의 등이 저장
위와 같은 변수들은 해당 메소드가 수행되는 동안 필요 하며 메소드수행이 끝나면 필요없게된다
즉 메소드가 호출 될 때 필요로 되는 변수들을 스택에 저장하고 , 메소드 실행이 끝나면 스택을 반환한다. JVM은 이러한 스택 영역을 실행중인 프로그램(쓰레드)에 따라 각각 구성하게된다.
LIFO(last-in-first-out)각 메소드를 위한 메모리상의 작업공간을 서로 구별되며(프레임),언제나 호출스택의 제일 위에 있는 메소드가 현재 실행중인 메소드 아래에 있는 메소드가 바로 위의 메소드를 호출한 메소드가 된다.
4.Nativa 메소드 스택
자바언어가 아닌 기존의 다른 언어에서 제공되는 메소드를 의미한다
그러 메소드의 매개변수,지역변수등을 저장한다 .
5.PC 레지스터
쓰레드가 시작할 때 생성되어 ,JVM이 현재수행할 명령어의 주소를 저장한다.
*실행엔진
적재된 클래스의 메소드내의 명령, 즉 바이트코드를 인터프리터하여 수행한다