JVM

sixhustle·2021년 10월 18일
0

Java

목록 보기
8/10

들어가기 전에 간략히

1. Java 실행 과정

  1. 개발자가 .java파일로 코드를 작성
  2. compiler가 .java 파일을 .class파일로 compile
    --- (아래부터 JVM) ---
  3. classloader가 .class파일 메모리에 적재
  4. 메모리는 method, heap, stack, pc, native method stack으로 구분

1. Class Loader

loading, linking, initializing 3가지 역할로 나눠 class파일을 로드하는 역할을 합니다.

1-1. loading

ClassLoader가 필요한 .class 파일들을 찾아 탑재합니다.
기본으로 제공받는 파일인지 또는 개발자가 정의한 파일인지 기준에 의해 Class Loader의 수준도 3가지로 나뉩니다.

class loaderdesc
Boostrap ClassLoader
.
가장 상위의 ClassLoader로 JVM을 구동시키기 위한 필수 라이브러리입니다.
따라서 OS에 맞게 native code로 개발되어 있습니다.
Extensions ClassLoader
.
Bootstrap 다음으로 우선순위를 가지는 ClassLoader입니다.
localedata, zipfs 등 다른 표준핵심 Java Class의 라이브러리들을 JVM에 탑재하는 역할입니다.
Application ClassLoader
.
Classpath에 있는 class들을 탑재합니다.
개발자들이 작성한 파일들을 JVM에 탑재합니다.

1-2. linking

탑재된 class파일들을 검증하고, 사용할 수 있게 준비하는 과정입니다.
Verification, Preparation, Resolution 3단계로 이뤄져있습니다.

stepdesc
verification
.
class파일이 유효한지 확인하는 과정입니다.
JVM 조건대로 구현되지 않았을 경우 VerifyError발생합니다.
preparationclass 및 interface에 필요한 static field 메모리를 할당하고, 기본값으로 초기화합니다.
resolution(무슨말이지....)

.
Symbolic Reference 값을 JVM 의 메모리 구성 요소인 Method Area 의 런타임 환경 풀을 통하여
Direct Reference 라는 메모리 주소 값으로 바꾸어줍니다.
해당 단계의 영향을 받는 JVM Instruction 요소는 new 및 instanceof 가 있습니다.

1-3. initializing

class파일의 코드를 읽습니다. class와 interface값들을 지정한 값들로 초기화 및 초기화 메소드를 실행시킵니다.
JVM은 multi-threading으로 동작하기 때문에 초기화 단계에서도 동시성을 고려해야 합니다.


2. Runtime Data Area

OS로부터 할당받은 JVM 메모리 영역으로 application을 실행할 때 사용되는 데이터들을 적재

2-1. Method

class 또는 interface에 대한 metadata가 저장됩니다.

datadesc
type information
.
.
.
1. interface 여부
2. pacakge명을 포함한 type 이름
3. type의 접근 제어자
4. 연관된 interface 리스트
runtime constant pool
.
1. type, field, method의 모든 reference 저장
2. JVM은 Runtime constant pool을 통해 실제 메모리 상 주소를 찾아 참조
field information
.
1. field type
2. field 접근 제어자
method information
.
1. constructor를 포함한 모든 method의 metadata 저장
2. method 이름, parameter수와 타입, 리턴 타입, 접근 제어자, 바이트 코드, 지역 변수 등 저장
class variable
.
1. static 키워드로 선언된 변수 저장
2. 기본형이 아닌 static 변수의 실제 인스턴스는 heap 메모리에 저장

2-2. Heap

런타임시 동적으로 할당(new 명령어)된 instance와 배열 등의 참조형 변수정보가 저장되는 공간

  1. heap 영역에 생성된 객체 와 배열은 stack영역의 변수나 다른 객체의 필드에서 참조
  2. 참조하는 변수나 필드가 없다면 GC(Garbage collector)의 대상

2-3. Stack

Thread마다 별개로 저장하고, method 호출할 때마다 frame을 추가하고, method가 종료되면 제거

datadesc
local variable
.
.
1. 지역 변수, 매개 변수, 메소드를 호출한 주소 등 method 수행 중 발생한 임시 데이터 저장
2. primitive type은 stack 영역에서 직접 값을 가진다.
3. reference type은 heap영역이나 method영역의 주소를 가진다.
operand stack...
frame data...

2-4. PC Register

thread가 현재 실행하고 있는 부분의 주소를 저장

2-5. Native Method Stack

자바 외 언어로 작성된 native code를 위한 메모리 영역


3. Execution Engine

Execution Engine은 Runtime Data Area에 적재된 bytecode를 실행(binary code로 변경)합니다.

기계어로 변경해 명령어 단위로 실행하는데, interprter, JIT 2가지 방식으로 실행합니다.

3-1. interpreter

명령을 순차적으로 읽으며 실행합니다. 파일 이름을 인자로 받으며, main함수를 포함해야 합니다.

3-2. JIT(Just In Time)

interpreter의 느린 단점을 개선한 compiler입니다. 유사한 bytecode를 캐싱해둬서 시간을 단축시켰습니다.


References

0개의 댓글