관리자

Runtime Data Area

- jvm이 프로그램을 수행하기 위해 OS로부터 할당받는 메모리 영역

 


영역

1. PC registers

2. Java Virtual Machine stacks

3. Native Method Stacks

4. Method Area,

5. Heap

 

---

1. PC registers

2. Java Virtual Machine stacks

3. Native Method Stacks

은 Thread 별로 생성되고

 

4. Method Area,

5. Heap

은 모든 Thread에 공유된다.


PC Registers

- Thread마다 하나씩 존재.

- Thread가 시작할 때 생성된다.

- Java Method를 수행하고 있다면, 현재 수행 중인 JVM instruction의 주소를 갖는다.

- Native Method(C언어 등)를 수행하고 있다면, undefined 상태이다.

- PC Registers에 저장되는 Instruction의 주소는 Native Pointer 또는 Method Bytecode의 시작점이다.

- Native Method는 platform dependent하므로 JVM을 거치지 않고 수행된다.

 

Stack Frame

- Java에서는 Method를 Stack Frame이라는 단위로 관리한다.

- Stack Frame은 Method의 상태 정보를 저장한다.

- compile time에 크기가 결정된다.

   (Method 내에서 사용하는 변수나 연산 관련 내용, 반환값의 Type이 이미 source code에서 결졍되기 때문에)

- 현재 실행되는 Stack Frame을 Current Frame이라 한다.

- 3 부분(Local Variable section, Operand Section, Fame Data Section)으로 구성된다.

 

1. Local Variable section

- Parameter, Local variable이 저장된다,

- index가 0부터 시작하는 array

- 0: this

- 사용되지 않는 local variable은 index가 없을 수도 있다.

- Primitive Type(원시 타입)은 고정된 크기가 할당되지만, Object는 (객체가 존재하는 Heap의 위치) Reference로 저장된다.

   Object는 CPU연산을 통해 Heap에서 값을 얻어야하고, Instance 생성이 일어나기 때문에 Primitive Type이 성능 면에서 낫다.

- char, byte, short, boolean은 int로 저장되지만 jvm 구현 방식과 Java Virtual Machine Stacks의 저장형태에 따라 달라진다.

Heap 등에서는 원래 타입으로 복원된다. boolean은 jvm에서 직접 지원하지 않아 int로 취급된다.

- long과 double은 두 개의 entry를 차지한다.

- Class Method의 경우 Reference가 존재하지 않는다.

 

 

2. Oprerand Stack

- 연산 공간

- 기본 스택과 동일하다.

 

3. Frame Data

- Constant Pool Resoultion 정보, Method가 정상 종료했을 때의 정보, Method가 비정상 종료했을 때의 Exception 정보가 들어있다,

- Constant Pool Resoultion: Constant pool의 Pointer 정보. Symbolic Reference를 jvm에서 접근할 수 있는 Direct Reference로 변경하는 것을 Resolution이라 한다. Class의 모든 Symbolic Referencesms Method Area의 Constant Pool에 저장되어있다.

- 상수, 다른 Class, Method, 특정 변수를 접근할 때, Class나 Interface에 대한 의존 관계를 확인할 때 Constant Pool을 참조한다.

- 자신을 호출한 Stack Frame의 Instruction Pointer가 들어있다. Method가 종료되면 이 값으로 PC register를 설정하고 Stack Frame을 빠져나간다. 반환값이 있다면 다음 Frame에 Push한다.

- Exception이 발생하는 경우를 위한 Excpetion 정보를 갖는다. (Exception Table의 Reference)

   Exception이 발생하면, jvm은 catch 절에 해당하는 bytecode로 jump한다.

 

 

Java Virtual Machine Stacks

- Thread마다 존재

- Thread가 시작할 때 생성

- 다른 Thread에서 접근이 불가능하여 동시성 문제가 없다.

- Thread가 Java Method를 수행할 때마다, Stack Frame을 생성하여 Java Virtual Machine Stacks에 Push한다.

- Stack Trace나 Stack Dump를 얻어서 분석할 때, 나오는 정보가 Java Virtual Machine Stack의 Stack Frame 정보이다. 

Stack Trace는 Stack Frame을 한 라인으로 표현한 것이다.

 

 

Native Method Stacks

- Java 외의 언어로 작성된 프로그램, API toolkit을 Java에서 사용/호출하기 위해 JNI(Java Native Interface)라는 표준 규약을 제공한다.

- Native Method를 위한 Stack이다. 언어별로 생성된다. Native Code가 C라면, C Stack, Native Code가 C++이라면, C++ Stack이 생성된다.

- Native Method가 종료되면 Java Virtual Machine Stack에 새로운 Stack Frame이 생성되고 실행된다. Native Method를 호출한 Stack Frame으로 돌아가지 않는다.

- 가장 흔히 사용하는 Hotspot JVM이나 IBM JVM은 Java Virtual Machine Stack과 Native Method Stack을 구분하지 않는다. 모두 Native Stack으로 통합되어있다. 즉, JVM이 사용하는 Thread가 모두 Native Thread이다.

 

Method Area

- 모든 Thread가 공유

- JVM이 시작할 때 생성. Garbage Collection의 대상

- Load된 Class/Interface(=Type)를 저장하는 논리적인 공간.

 

1. Type Information

- Package.class의 Full Qualified Name

 

2. Constant Pool

3. Field Information

4. Method Information

5. Class variables

6. Reference to class ClassLoader

- 다른 type을 참조할 때 동일한 ClassLoader를 사용한다.

 

7.Reference to Class class

- Type이 Loadehlaus java.lang.class의 instance가 하나 생성된다. 이 reference가 type 정보의 일부로 저장되어 class 이름이나 interface여부를 알 수 있다.

 

 

Method Table

- Method에 대한 Direct Method를 갖는 자료구조

 

 

 


참고자료 및 출처

- Java Performance Fundamental(김한도 저)

book.naver.com/bookdb/book_detail.nhn?bid=6102334

 

- oracle: The Structure of the Java Virtual Machine

docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html

'언어 > Java' 카테고리의 다른 글

JVM internal - 0.Overview  (0) 2021.01.30
what jit likes and dislikes  (0) 2021.01.17
jit optimization - 흥미로운 사실1  (0) 2021.01.17
java 동작 원리  (0) 2021.01.17
Java ME vs SE vs EE, JRE  (0) 2021.01.12

+ Recent posts