관리자

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

JVM architecture

1. JVM은 Class Loader System을 통해 Class 파일을 JVM으로 로딩한다.

2. Class 파일은 Execution Engine을 통해 해석된다.

3. 해석된 프로그램은 Run-time Data Area에 배치되어 실질적으로 수행되는데,

4. 실행 과정에서 Thread Synchronization과 Garbage Collection 같은 관리작업이 일어난다.

 

 

출처 : Java Performance Fundamental(김한도 저)

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

jvm internal - 1. Runtime Data Area  (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