[자바]JVM

allnight5·2022년 11월 30일
0

자바 개념정리

목록 보기
12/28

참조

JVM(Java Virtual Machine)

JVM은 스택 기반 가상 머신이며 효율적인 연산과 메모리 사용이 가능하다.

Compile(컴파일)이란 개발자가 작성한 코드를 바이너리 코드로 변환하는 과정으로 -> 컴퓨터가 이해하는 기계어로 변환하는 작업이다.

  1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받습니다
  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트코드(.class)로 변환
  3. 클래스 로더(Class Loader)는 .class파일들을 읽고 바이트 코드를 메서드 영역(Method Area)에 저장합니다. 각 .class 파일은 JVM에 의해 메서드 영역에 다음의 정보들을 저장합니다.
  4. class파일이 로딩(Loading)된 후, JVM은 힙 메모리 영역에 이 파일이 나타내는 클래스 유형의 객체를 생성합니다.
  5. 이 후 클래스 로더는 Linking을 통해 여러개로 분리된 소스파일들을 컴파일한 결과물들 중에서 최종 실행 가능한 파일을 만들기 위해 필요한 부분을 찾아서 연결해줍니다
  6. static으로 선언된 변수와 메서드에 메모리를 할당하고 초기값을 Initialize합니다
  7. .class 파일들은 Execution engine을 통해 해석합니다
  8. 해석된 바이트코드는 Runtime Data Area에 배치되어 실질적인 수행이 이루어지게 됩니다.

JVM구성요소

클래스 로더를 통해 Loading, Linking, Initialization을 했고, 실행 엔진을 통해 .class파일을 해석하여 Runtime에 실질적인 수행이 이루어지게 된다.
1) Class Loader(클래스 로더)
클래스를 처음으로 참조할 때 해당 클래스를 로드하고 링크하는 것이고 이 역할을 클래스 로더가 수행하는 것입니다.
2) Execution Engine(실행 엔진)
자바 바이트코드는 기계가 바로 수행할 수 있는 언어보다는 인간이 보기 편한 형태로 기술된 것이여서 기계가 실행할수 있는 형태로 변경하는데 클래스 파일을 실행 시키는 방법에 따라 크게 두가지 방식으로 사용된다.
2-1) Interpreter(인터프리터)
실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행합니다. 한줄씩 수행하기 때문에 느리다
2-2) JIT(Just-In-Time)
물론 JIT컴파일러가 컴파일하는 과정은 바이트코드를 인터프리팅하는 것보다 훨씬 오래 걸리기 때문에 한 번만 실행되는 코드라면 컴파일하지 않고 인터프리팅 하는 것이 유리할 수 있습니다. JIT컴파일러를 사용하는 JVM들은 메서드가 자주 사용되는지 체크하고 정해진 기준을 넘어 선다면 인터프리터 형식을 네이티브 코드(Native Code)로 변경하여 캐시에 보관하게 되고 빠르게 수행하게된다.

profile
공부기록하기

0개의 댓글