티스토리 뷰

Java

JVM의 기본구조

토마's 2016. 7. 27. 22:37

우선, 자바에 대한 포스팅에 앞서서 자바가 JVM 위에서 실행되기 때문에 먼저 JVM에 대해서 포스팅 하겠습니다.

JVM은 Java Virtual Machine의 약자로 사용자자 Java 파일을 생성한 후, JDK 컴파일을 거쳐 바이트코드(.class)

가 되어 JVM을 거치면서 컴퓨터가 사용할 수 있는 기계언어로 변경시켜주는 역할을 합니다.


자바 실행 흐름 : 사용자 Java코드 생성 -> JDK컴파일(.class파일 생성) -> JVM -> 실행


다음은 JVM의 기본 구조 입니다.


JVM은 기본적으로 Stack에서 모든 연산이 이루어질 수 있도록 설계되어있습니다.

바이트 코드는 명령들의 집합으로써 각 명령들은 1byte의 opcode와 n개 이상의 연산자(operand)로 구성되어 있으며,

opcode에는 JVM에서 실행할 명령 코드가 들어있습니다.

 

1) 스택(Runtime Stack)

바이트 코드(컴파일된 목적 코드)를 불러들여서(load) 지역변수(local variable)을 할당합니다.

블록 영역을 벗어나면 소멸하며 반드시 초기화 작업이 선행 되어야 한다. 즉, 자동으로 초기화가 되지 않습니다.

 

2) 힙(Heap : The garbage-collected Heap)

배열이나 클래스 객체(인스턴스)가 할당되며, GC(Garbage Collector)가 관리합니다. 이 영역은 특별한 초기화

없이도 사용 가능합니다. 참고로 인스턴스(instance)들의 초기값은 NULL입니다.

 

3) 상수 영역(literal pool)와 메소드 영역(method area)

실질적으로 바이트 코드(목적 코드)가 위치하는 영역이고, 고정(static) 값을 가지는 상수(constant), 추상 

소드(abstract method)가 위치하는 영역이며, 실행(runtime)시 호출(call)을 위해서 주소 위치를 갖게 됩니다.

특히, 외부에서는 호출되는 메모리의 주소(위치)를 파악할 수 없어서 해킹이 어려우며(보안) 참고로 native 

area는 다른 언어(C, C++ 등)의 메소드 사용시 그 메소드들이 불러들여지는 영역입니다.

 

4) 레지스터 영역(process register area)

JVM 실행시 호출할 메모리 주소를 기억해두는 곳이며, 실행 프로세서들이 작동될 때 이곳에 등록(registration)된 

내용을 기초로 실행됩니다.

 

5) Registers

① optop register(operand-top register)

    연산자(operand)의 마지막 주소를 가지고(혹은 가리키고)있습니다. 즉, 보관.

② PC register(program counter register)

    메소드 영여의 몇 바이트를 가리키고 있으며 바이트 코드가 실행되면서 한 명령이 실행된 후 다음 명령이

    실행될 메모리 주소값을 가지고(fetch) 있고, 쓰레드(thread)의 실행 진행 상황을 주시하는 역할도 합니다.

③ vars register

    실행중인 메소드의 요소들(지역변수, 반환 값(return value) 등)의 주소값을 가지고(가리키고) 있습니다.

④ frame register(stack frame register : Execution Environment Area(Sector))

    스택(operand stack) 자체의 연산을 수행 및 관리하는 역할을 합니다. 물론, 언급한 바와 같이 JVM은 바이

    트 모드에 대한 모든 연산을 이 스택에서 실행하게 된고, 연산시 인자들(parameter, 매개변수) 및 명령 및

    결과들을 연산하기 위해 임시적으로 보관합니다. 실행 환경(Execution Environment) 변수들에 대한 주소를

    가지고 있습니다.