본문 바로가기

Programming/Java

JVM(JavaVirtualMachine)

JVM(JavaVirtualMachine)

JVM(JavaVirtualMachine)은 자바언어를 클래스로더를 통해 바이트코드로 해석하고 실행하는 머신이다.

JVM이 있기에 자바는 플랫폼에 독립적일수 있다는 것은 자바개발자라면 알것이다. 물론 요즘에는 자바이외에도 스칼라, 그루비등 많은 언어가 JVM위에서 동작한다. 그리고 JVM을 알고 있어야 좋은 개발자라는 이야기를 많이 보았다.


JVM은 중간언어로 바이트코드를 사용한다.

 자바는 C/C++처럼 직접적으로 CPU가 이해할 수 있는 기계어로 변환하지 않고 JVM이 이해할 수 있는 바이트코드로 변환한다. 이 점은 장비에 의존하지 않고 JVM이라는 가상머신에 의존하기 때문에 JVM만 있으면 어디서든 동작할 수 있다는 장점이 있다. 


 JVM은 클래스파일을 JVM의 메모리에 로드하고 검증한다. 읽어들인 클래스가 자바 언어로 잘 구성되었는지 검사한다. 자바 클래스 로드의 전 과정중 가장 복잡하다. 그리고 클래스가 필요로하는 메모리를 할당하고 클래스에서 정의된 필드, 메서드, 인터페이스를 나타내는 데이터구조를 준비한다. 이 후에는 클래스의 상수 풀 내 모든 심벌릭 레퍼런스를 다이렉트 레퍼런스로 변경한다. 그리고 static 필드를 설정된 값으로 초기화한다.

이렇게 총 로드 -> 검증 -> 준비 -> 분석 -> 초기화 과정을 거친다.


런타임 데이터영역은 다음과 같다.

 데이터영역에는 총 6개의 영역으로 나눌 수 있다. 

PC레지스터, 스택, 메이티브 메서드 스택은 스레드마다 하나씩 생성된다.

PC레지스터 - 스레드가 시작될때 생성된다. 현재 실행중인 JVM 명령의 주소가 저장된다. CPU에 명령어를 전달하고 임시로 저장한다.

스택영역 -  스택 프레임이라는 구조체를 저장하는 스택이다. JVM은 오직 JVM스택에 스택 프레임을 추가하고 꺼내는 작업만 실행한다. 각 스택프레임은 메서드가 실행 될때마다 하나의 스택프레임이 생성돼 해당 스레드의 JVM스택에 추가되고 종료되면 제거 된다. 지역변수 배열. 피연산자 스택, 현재 실행 중인 메서드가 속한 클래스의 런타임 상수 풀에 대한 레퍼런스를 갖는다. 

네이티브메서드 스택 - 자바 이외의 언어로 작성된 라이브러리를 실행 하기위한 스택이다.


메서드영역, 런타임 상수풀, 힙영역은 모든 스레드가 공유하여 사용한다.

메서드영역 - JVM이 읽어들인 각 클래스와 인터페이스에 대한 런타임 상수 풀, 필드와 메서드정보, 스태틱 변수 메서드와 바이트코드 등을 보관한다.

런타임 상수풀 - 각 클래스와 인터페이스의 상수뿐만 아니라 메서드와 필드에 대한 모든 레퍼런스까지 담고 있는 테이블이다. 어떤 메서드나 필드를 참조할 때 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상의 주소를 찾아서 참조한다.

힙 - 객체를 저장하는 영역으로 가비지 컬렉션이 발생하는 구간이다. 








 

'Programming > Java' 카테고리의 다른 글

Lambda  (0) 2016.08.04
Generics  (0) 2016.06.16
HashMap VS HashTable VS ConcurrentHashMap  (0) 2016.05.21