TIL

JVM

JVM이란

JAVA Virtual Machine은 자바 바이트코드를 실행하는 가상 머신이다. 이 바이트코드는 .java 파일을 컴파일한 .class파일로부터 얻을 수 있다.

JVM은 운영 체제에 의존하지 않는 인터페이스를 제공하기 때문에 가상이라고 한다. 이러한 OS 및 하드웨어로부터의 독립성은 java 프로그램의 write-once-run-anywhere 가치의 초석이다.

JVM은 GC, adaptive optimizer를 사용해 java 애플리케이션을 최적화할 수 있다.

JVM 구조

img.png

클래스 로더

자바는 컴파일 타임이 아니라 런타임에 클래스를 로드하고 링크하는데 이를 클래스 로더가 수행한다. 로드한다는 것은 클래스가 요청될 때 javac가 컴파일한 .class 파일을 읽고 바이너리 데이터를 생성하여 메모리에 저장하는 것을 의미한다.

로딩, 링크, 초기화 순으로 이루어진다.

Loading

클래스 파일(.class)을 바이트코드로 읽어 메모리(메소드 영역)로 불러오는 과정인데 저장하는 정보는 다음과 같다.

.class 파일을 로드한 후 JVM은 힙 메모리에 이 파일을 나타내기 위해 Class 타입의 객체를 생성한다.

이 클래스 객체는 클래스 이름, 부모 이름, 메서드 및 변수 정보 등과 같은 클래스 수준 정보를 얻기 위해 개발자가 사용할 수 있다.

링크는 생성된 바이트 코드가 적절한지에 대한 여부를 확인한다. 적절하지 않다면 에러가 발생한다.

**Initialization**

static 변수의 값을 할당하고 static 블록이 있다면 이때 실행된다.

JVM 메모리 영역

JVM 실행 엔진

JVM에 할당된 모든 코드는 실행 엔진에 의해 실행된다. 실행 엔진은 바이트코드를 읽고 하나씩 실행한다. 내장된 interpreter와 JIT 컴파일러를 사용해 바이트코드를 기계어로 변환하고 실행한다.

JVM을 사용하면 인터프리터와 컴파일러 모두 네이티브 코드를 생성한다. 차이점은 코드를 생성하는 방법, 최적화 방법, 최적화 비용에 있다.


https://does-log.tistory.com/40