관리자

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

jit(and all compilers) are just complex pattern matchers

 

Likes

  • "normal" code
  • small methods
  • immutability
  • local variables(not shared across thread. easy change tracking)

Don't likeLikes

  • "normal" code
  • small methods
  • imuutability
  • local variables (not shared across thread. easy change tracking)

youtu.be/oH4_unx8eJQ?t=5650

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

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

1. naming

위가 아래보다 느리다.

 

compiler는 log 파일을 이용하는데, this.size와 this.elementData.length는 동일하지 않기 때문이다.(값은 동일하지만.)

 

this.size = this.elementData.length

for (int i = 0; i < this.size; i++) {
	
    if ( i >= this.elementData.length) throw new AIOBE();

}
// this.size = this.elementData.length

for (int i = 0; i < this.elementData.length; i++) {
	
    if ( i >= this.elementData.length) throw new AIOBE();

}

youtu.be/oH4_unx8eJQ?t=2178

 

2. implicit null check

if ( this.elementData == null ) throw new NPE();

this.elementData.length

 

C언어를 생각해보면 

this.element가 null일 때, this.element.length에 접근하면 segmentation fault가 발생한다.

java는 segmentation fault를 NPE로 wrap한다.

이 과정이 쉽고 빠르다고 한다.

 

 

3. Garbage Collection(Stop The World)

Garbage collection을 하기 위해서는 모든 thread를 정지시켜야한다.

thread를 정지시키는 방식이 꽤 재미있다.

 

poison page라는 개념을 이용한다.

JIT은 주기적으로 각 thread에 poison page를 읽으라는 명령어를 집어넣는다.

Garbage Collection이 필요하면 page를 unmap해서,

모든 thread에서 segmentation fault가 발생하도록 한다.

 

youtu.be/oH4_unx8eJQ?t=2868

 

4. loop peeling

youtu.be/oH4_unx8eJQ?t=3161youtu.be/oH4_unx8eJQ?t=3161

 

5. inlining & iterator is not a synthetic sugar

- inlining: youtu.be/oH4_unx8eJQ?t=3512

- iterator is not a synthetic sugar: youtu.be/oH4_unx8eJQ?t=4075

 

 

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

jvm internal - 1. Runtime Data Area  (0) 2021.01.30
JVM internal - 0.Overview  (0) 2021.01.30
what jit likes and dislikes  (0) 2021.01.17
java 동작 원리  (0) 2021.01.17
Java ME vs SE vs EE, JRE  (0) 2021.01.12

코드는 compile, link, execute의 3가지를 거쳐 프로그램으로 실행된다.

 

대부분의 컴퓨터 언어는

  • compiler가 object file을 생성하고, linker가 object file을 연결하여 executable file을 만든다.
  • compiler는 platform dependent하기 때문에(target machine, OS의 영향을 받기 때문에)
    언어 개발자들은 platform마다 알맞은 compiler를 새로 만들어야 했다.
  • 일반 프로그래머들(high-level languge로 프로그래밍을 하는 사람)은 코드를 조금만 수정해도
    실행하기 위해서는 처음부터 compile을 해야했다.
    더보기
    (프로그램 사이즈가 큰 경우엔 compile에만 상당한 시간이 걸리기도 한다.)
    compile이 끝나고 실행하는데, 오타 때문에 수정된 부분을 제대로 확인도 못하고
    다시  긴 compile을 기다려본 적이 있다면 얼마나 귀찮은지 공감할 것이다.

 

interpreter로 동작하는 언어는

  • compile, link, execute의 단계가 존재한다기보다는
  • 코드 statement를 읽을 때마다 high-level statement를 low-level로 conversion하여 수행한다.
  • interpreter는 3가지 유형으로 나뉜다.

 

 

java는 compiler와 interpreter가 혼합된 형태이다.

  1. java compiler(javac)가 high-level code로부터 bytecode(.class file)를 생성한다.
    (bytecode는 object file이 아니다.)
  2. jvm이 bytecode를 이용하여 interpreter처럼 statement를 읽을 때마다 동적으로 link-execute를 수행한다.
    (bytecode가 jvm interpreter의 object file처럼 동작한다.
    linker가 존재하지 않고 동적으로 link를 수행한다는 것이 다르다)

장점

- platform independent하다. jvm이 os에 dependent 하지만 java compiler는 platform independent 하다.

windows에서 코드를 작성하고 compile한 뒤 linux에서 실행할 수 있다.

 

 

참고한 자료

www.cs.cmu.edu/~jcarroll/15-100-s05/supps/basics/history.html

 

How Java Works

Most computer languages use the "compile-link-execute" format. You start with source code and the compiler converts this program into a  low-level program. In most compiled languages, the file containing the resulting low-level code is called an object 

www.cs.cmu.edu

 

 

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

jvm internal - 1. Runtime Data Area  (0) 2021.01.30
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 ME vs SE vs EE, JRE  (0) 2021.01.12

+ Recent posts