JVM

  • 실행될 클래스 파일을 메모리에 로드 후 초기화 작업 수행
  • 메소드와 클래스변수들을 해당 메모리 영역에 배치
  • 클래스 로드가 끝난 후 JVM은 main메소드를 찾아 지역변수, 객체변수, 참조변수를 스택에 쌓음
  • 다음 라인을 진행하면서 상황에 맞는 작업 수행 

JVM은 운영체제에 독립적

Java를 사용하려면 JDK를 설치해야하는데 JDK는 운영체제별로 종류가 다르다.

JDK안에는 JRE, API,JVM이 포함되어 있다.

운영체제마다 다른 JVM이 제공되어 독립적일 수 있다.

 

JVM 실행

자바 코드 (.java) 컴파일  -> 바이트 코드파일 생성(.class) -> 기계어 코드파일 변환 (JVM역할)

 

1. Class Loader

실행에 필요한 실행파일(.class)찾는다

- bootstrap classloader

- extension classloader

- application classloader

 

2. 바이트 코드 검증 

클래스 로더가 모든 실행 파일을 준비하면 이 파일의 코드가 올바른지 검증한다.

 

3. 기계어 코드로 변환

Java실행 파일은 바이트 코드이기 때문에 실행될때 다시 한번 기계가 읽을 수 있는 형태로 인터프리터를 통해 해석된다.

 - 인터프리터

 - JIT 컴파일러

 

Runtime Data Area

런타임 데이터 영역에서
여러 쓰레드가 heap, method area ( + runtime constant pool) 공유하고
쓰레드는 PC register , stack , Native method stack 가진다. 

 

1. Method area

JVM이 읽어 들인 클래스와 인터페이스에 대한 runtime constant pool, 멤버변수, 클래스 변수, 생성자와 메소드를 저장하는 공간

메서드 영역은 모든 스레드가 공유하는 영역으로 JVM이 시작될 때 생성된다. JVM이 읽어 들인 각각의 클래스와 인터페이스에 대한 런타임 상수 풀, 필드와 메서드 정보, Static 변수, 메서드의 바이트코드 등을 보관한다. 메서드 영역은 JVM 벤더마다 다양한 형태로 구현할 수 있으며, 오라클 핫스팟 JVM(HotSpot JVM)에서는 흔히 Permanent Area, 혹은 Permanent Generation(PermGen) 이라고 불렸는데 지금 Metaspace라고 불린다. 메서드 영역에 대한 가비지 컬렉션은 JVM 벤더의 선택 사항이다

- JVM시작시 생성

- 프로그램 종료시 까지

- 구성 방식이나 GC방법은 JVM벤더마다 다를 수 있다.

* runtime constant pool :  상수 풀은 특정 클래스의 코드를 실행하는 데 필요한 상수를 포함한다. 기본적으로 심볼 테이블과 유사한 런타임 데이터 구조이다. 자바 클래스 파일에서 클래스별 또는 인터페이스별 런타임을 표현한다. JVM은 클래스 파일을 로드하면서 이 constant_pool 정보를 메서드 영역의 런타임 상수 풀에 넣는다

 클래스 파일 포맷에서 constant_pool 테이블에 해당하는 영역이다. 메서드 영역에 포함되는 영역이긴 하지만, JVM 동작에서 가장 핵심적인 역할을 수행하는 곳이기 때문에 JVM 명세에서도 따로 중요하게 기술한다. 각 클래스와 인터페이스의 상수뿐만 아니라, 메서드와 필드에 대한 모든 레퍼런스까지 담고 있는 테이블이다. 즉, 어떤 메서드나 필드를 참조할 때 JVM은 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조한다.

 

 

 

2. Heap area

런타임시 동적으로 할당하여 사용하는 영역이다

new연산자로 생성된 객체와 배열을 저장한다.

참조하는 변수나 필드가 없다면 의미없는 객체가되어 GC대상이 된다.

 

3.Stack area

JVM 스택안에 스택프레임 구조를 저장한다.

각 스레드 마다 존재한다.

메소드 호출시 프레임을 추가하고 메소드가 종료되면 프레임제거하는 동작을 수행한다.

후입선출

primitive 타입변수는 스택영역에 직접 값을 가진다.

JVM 스택은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 생성된다. 스택 프레임(Stack Frame)이라는 구조체를 저장하는 스택으로, JVM은 오직 JVM 스택에 스택 프레임을 추가하고(push) 제거하는(pop) 동작만 수행한다. 예외 발생 시 printStackTrace() 등의 메서드로 보여주는 Stack Trace의 각 라인은 하나의 스택 프레임을 표현한다

 

5. PC register

스레드가 생성될때 마다 생기는 공간이다. 

스레드가 어떠한 명령을 실행하게 될지에 대한 부분을 기록한다.

 

6. Native method stack area

자바 외 언어로 작성된 네이티브 코드를 위한 영역이다.

 

참고 

https://docs.oracle.com/javase/9/docs/api/java/lang/management/MemoryMXBean.html

https://goneoneill.tistory.com/43

'* > What I did today' 카테고리의 다른 글

Tree  (0) 2023.01.10
null 대신 Optional 클래스  (0) 2023.01.02
GC  (0) 2023.01.01
static 변수는 JVM의 어디에 저장될까 ?  (0) 2022.12.25
Java - static 사용의 지양  (0) 2022.12.17
Cache  (2) 2022.12.15
서버가 죽는 이유 ,message queue  (0) 2022.07.20
AWS Certified Cloud Practitioner - 합격 후기, 참고자료 정리  (4) 2021.12.14

+ Recent posts