Java와 JVM -4

Newbie's Log 2014. 12. 6. 22:01


Runtime Data Areas는 Process로서의 JVM이 프로그램을 수행하기 위해 OS로부터 할당 받는 메모리 영역이라고 정의 내릴수 있는데 각각의 목적에 따라 5개의 영역으로 나뉜다. 

1.PC Registers

2.Java Virtual Machine Stacks

3.Native Method Stacks

4.Method Area

5.Heap


이렇게 말이다. PC Registers와 Java Virtual Machine Stacks, Native Method Stacks 각 Thread 별로 생성이 되고, Method Area와 Heap은 모든 Thread에게 공유된다. 




요번 포스팅에서 위에 5개 영역중 PC Registers에 대해 알아보도록 하자.


프로그램의 실행은 CPU에서 명령어,즉 instruction을 수행하는 과정으로 이루어진다. CPU는 이러한 Instruction을 수행하는 동안 필요한 정보를 레지스터라고 하는 CPU내의 기억장치를 사용한다. 

1+2라는 연산을 수행하는 경우 이것을 최소단위로 쪼개보면 연산의 대상이 되는 1과 2도 있을 것이고 더하라는 연산도 있을 것이다. 연산을 하나씩 수행해 보면 먼저 1이라는 값을 받고 다시 2라는 값을 받은 후 이 두 숫자를 더한 결과값을 내는 과정으로 진행될 것이다. 그런데 1을 받고 2를 받을 때 먼저 받아 놓은 1이라는 상수는 2를 받는 행위를 할 동안 이 값들은 CPU에 잠시 기억된다. 


1과 2처럼 명령 실행에 사용되는 데이터를 Operand라고 하며, 더하라는 연산 명령과 같은 add Instruction도 존재한다. CPU는 이것도 미리 기억을 하고 있었어야 한다. 그리고 이 연산의 결과인 3이라는 Operand도 메모리로 전달하기 전에 CPU 어딘가에 잠시 머무르도록 해야 한다. 


이때 사용하는 CPU내의 기억장치를 레지스터라 한다. 


하지만 Runtime Data Area의 메모리 영역인 PC Register는 이것과는 다르다. Java는 Register-Base로 구동되는 방식이 아니라 Stack-Base로 작동한다. JVM은 CPU에 직접 Instruction을 수행하지 않고 Stack에서 Operand를 뽑아 내어 이를 별도의 메모리 공간에 저장하는 방식을 취하고 있는데 이것이 PC Register이다.



Java는 플랫폼에 독립적이기는 하나 OS나 CPU의 입장에서 보면 하나의 프로세스에 지나지 않기 때문에 머신의 리소스를 사용해야 하는 것이 당연하다. 그렇기 때문에 Java도 현재 작업하는 내용을 CPU에 Instruction으로 제공해야 했고 이를 위한 버퍼공간으로서 PC Register라는 메모리 영역을 생성한 것이다. 


PC Register는 각 Thread마다 하나씩 존재하며 Thread가 시작할 때 생성된다. 

만약 Thread가 Java Method를 수행하고 있으면 Java Virtual Machine Instruction의 주소를 가지고 있게 된다. 만약 C언어등으로 Native Method를 수행하고 있다면 PC Registers는 undefined 상태로 있게 된다.왜냐하면 앞으로 배울 Native Method Stack에서 따로 처리하기때문이다. 이 PC Register에 저장되는 Instruction의 주소는 Native Pointer일 수도 있고 Method Bytecode의 시작점 일 수도 있다. Native Method를 수행할 때는 JVM을 거치지 않고 바로 수행하게 된다. 어차피 Native Code는 Platform에 종속 될 수 밖에 없기 때문에 JVM을 경유할 필요가 없기 때문이다. 



이렇게 PC Register에 설명해 보았다. 

다음 포스팅은 Java Virtual Machine Stacks에 대해 설명하도록 하겠다.


참고 Java performance Fundamental(김한도 저)

 



Posted by 알 수 없는 사용자
,