티스토리 뷰

Java virtual Machine Stacks는 Thread의 수행정보를 기록하는 Stack Frame을 저장하고 있는 영역이다.

Java virtual Machine Stacks도 Thread 별로 한 개씩 존재하며 Thread와 함께 생성된다.

Java Virtual Machine Stacks는 Thread의 배타적인 영역으로 서로 공유되지 않는다.

Java Virtual Machine Stacks은 각각 분리된 Stack Frame을 Pop, Push하는 작업을 수행하게 된다.

Java Virtual Machine Stacks의 구현은 JVM Vendor가 알아서 하게 된다.

Stack Frame은 Method별로 하나씩 생성된다. Method가 수행되면 해당 Thread의
Java Virtual Machine Stacks에 새로운 Frame이 Push되고 이것은 Current Frame이 된다.

이 Current Frame에는 Parameter변수, 지역변수(Local Variable), 중간 연산자등등의 데이터가 저장된다.

Method의 수행이 종료되면 Stack Frame은 Pop되면서 Java Virtual Machine Stacks에서 제거되고 이전의 Frame이 Current Frame이 된다.



Stack Frame은 Local Variable, Operand Stack, Frame Data의 세 부분으로 구성된다.

Local Variable Section, Operand Stack의 크기는 Compile Time에 결정 된다.

Method를 call할 때 Class Data를 체크하여 적절한 크기로 Stack Frame을 생성하여 Java Stack에 Push하게 된다.

Local Variable Section은 Array로 구성되어 있고 Index를 가지고 Data를 찾아간다.

Method Parameter와 Local Variable이 저장되며 이중 Method Parameter는 선언된 순서로 Index가 할당된다.

Operand Stack도 Array로 구성되어 있지만 Index를 통해 Data를 접근하는 것이 아니라 값을 Push, Pop하면서 사용하게 된다.

이것은 Operand Stack이 변수들의 값을 저장하는 임시 저장소의 역할을 하기 때문에 가능하다. 많은 Instruction이 Opreand Stack에 값을 POP하여 연산하고 그 결과를 Push하는 식으로 사용한다.

하나의 Instruction이 Operand Stack에 값을 Push하게 되면 다른 Instruction이 이 값을 Pop하여 사용이 가능하다.

Frame Data는 Constant Pool Resolution, 정상 종료시 돌아갈 지점, 비정상 종료시 처리할 예외 등의 정보를 가지고 있게 된다.

Constant Pool Resolution은 특정 Method나 Field값을 참조하게 될 때 Method Area의 Constant Pool의 정보를 참조하게 된다. 그리고 특정 Object가 Constant Pool entry에 의해 지정된 특정 Class 또는 Interface의 의존관계가 있는지를 확인하기 위해서도 사용된다.

Resolution은 Symbolic Reference를 실제 Pointer로 변경한 작업을 의미한다.

Method가 정상 종료하게 되면 이 Method를 호출한 Stack Frame으로 되돌아 가기 위해 PC Register에 이 Instruction의 Pointer를 제공해야 한다. 만약 반환값이 있는 경우 Invoking Method의 Operand Stack에 이 반환값을 Push한다.

비정상 종료는 Exception이 발생함을 의미하는데 Frame Data에 이 Exception Table을 참조하기 위한 정보를 가지고 있다. Exception Table은 Catch 절로 보호되는 영역의 Bytecode의 정보가 있다. 즉 Try의 시작 Bytecode의 위치, 끝지점의 위치, Exception 이 발생한 Constant Pool의 index, catch절 code의 시작지점이 들어가게 된다.

Exception이 발생하게 되면 JVM은 이 Exception을 어떻게 핸들링할 지를 결정하기 위해 frame Data를 통해 Exception Table을 참조하게 된다. Excpetion이 발생할때 Catch절과 매칭되명 수행하고 없으면 바로 Exception을 던지고 종료한다. 이 때 Exception은 invoking method frame에도 같이 던져진다. 그밖에 Frame Data는 Debug 정보도 가지고 있게 된다.
저작자 표시 비영리 변경 금지
신고

'기술이야기' 카테고리의 다른 글

Runtime Data Areas - Method Area  (0) 2009.10.28
Runtime Data Areas - Java Virtual Machine Stacks  (0) 2009.10.27
Runtime Data Areas - PC Register  (0) 2009.10.27
Runtime Data Areas의 구조  (0) 2009.10.27
댓글
댓글쓰기 폼