JAVA 기초 : JVM(Java Virtual Machine)

mark1106·2023년 7월 20일
0

JAVA

목록 보기
10/11

JVM이란?

JVM(Java Virtual Machine)은 자바 언어로 작성된 프로그램을 실행하기 위한 가상 컴퓨터이다.

개발자가 자바 언어로 코드를 작성하면 CPU가 인식을 하지 못해 기계어로 컴파일 과정을 거쳐야 한다.

다른 언어와 달리 자바는 JVM이라는 가상머신을 통해 자바 바이트코드를 실행할 수 있는 환경을 제공해준다.

이 JVM 덕분에 OS 종류에 종속받지 않고 JAVA 애플리케이션을 실행할 수 있다.

JVM 구성

JVM 구성요소

  • 클래스 로더(Class Loader)

  • 실행 엔진(Execution Engine)
    1) 인터프리터(Interpreter)
    2) JIT 컴파일러(Just-in-Time)
    3) 가비지 콜렉터(Garbage Collector)

  • 런타임 데이터 영역(Runtime Data Area)


클래스 로더(Class Loader)

JVM은 클래스 파일을 동적으로 로딩하기 위해 클래스 로더를 사용한다. 클래스 로더는 클래스 파일을 찾아 JVM 메모리에 로드하고 링크 작업을 수행한다.

실행 엔진(Execution Engine)

JVM은 클래스 파일을 실행하기 위한 실행 엔진을 갖고 있다. 실행 엔진은 클래스 파일을 바이트 코드 단위로 읽어 해석한다. Interpreter(인터프리터) 방식과 JIT compiler 방식을 사용한다.

1) 인터프리터(Interpreter)

인터프리터는 프로그래밍 언어의 소스 코드를 바로 실행하는 프로그램이다.
원시 코드를 기계어로 번역하는 컴파일러와 달리 자바 바이트 코드를 한 줄씩 읽고 번역하여 실행한다.(단, 한 줄씩 읽으므로 실행이 느림)

2) JIT 컴파일러(Just In-Time Compiler)

한 줄씩 읽어 들여 속도가 느린 인터프리터의 단점을 보안하기 위해 JIT 컴파일러를 사용한다.
JIT 컴파일러는 반복되는 바이트 코드를 native code로 변환하여 사용한다.
인터프리터로 계속 해석하지 않고 JIT 컴파일러로 변환한 native code를 빠르게 꺼내 쓸 수 있다.
(즉, 일반 코드는 인터프리터로 실행되고, 일정 수준 이상 반복되는 코드는 JIT 컴파일러가 native code로 변환)

3) 가비지 컬렉터(Garbage Collector)

동적으로 할당된 객체들 중에서 사용되지 않는 객체들을 자동으로 회수한다.
가비지 컬렉터는 메모리 관리를 담당하여 개발자가 직접 메모리를 해제하는 번거로움을 덜어준다.

런타임 데이터 영역(Runtime Data Area)

JVM 내에서 자바 프로그램의 실행에 필요한 데이터를 저장하는 메모리 영역이다.
자바 프로그램이 실행되면서 생성되는 객체, 메소드, 변수 등의 데이터가 저장된다.

1) 메소드 영역(Method Area)

모든 클래스와 메소드의 정보가 저장되는 공유 메모리 영역이다.
클래스의 바이트 코드, 메소드의 바이트 코드, 정적 변수, 상수 등이 저장된다.

2) 힙 영역(Heap Area)

동적으로 생성된 객체들이 저장되는 영역이다. 힙 영역은 GC(Garbage Collector)의 대상이 되는 메모리 영역으로, 힙 영역에서 더 이상 사용되지 않는 객체들이 자동으로 회수된다.

3) 스택 영역(Stack Area)

각 쓰레드마다 별도로 생성되는 영역으로, 메소드 호출 시 지역변수, 매개변수, 메소드 호출 스택 등이 저장된다.
메소드 호출 시 스택 프레임이 생성되며, 메소드 호출이 끝나면 해당 스택 프레임이 제거된다.

4) PC 레지스터(PC Register)

각 쓰레드마다 현재 실행 중인 명령어의 주소를 저장.

5) 네이티브 메소드 스택 영역(Native Method Stack Area)

자바 이외의 네이티브 코드를 위한 스택 영역이다.
c, c++ 등 다른 언어로 작성된 메소드로, JVM 바깥에서 실행된다.

profile
뒤돌아보면 남는 것은 사진, 그리고 기록 뿐

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

글 잘 봤습니다, 감사합니다.

답글 달기