Java

JVM ( Java Virtual Machine )

Carlos._. 2023. 4. 6.
반응형

 

JVM 이란 ?

 

자바 가상 머신 JVM은 자바 프로그램 실행환경을 만들어 주는 소프트웨어입니다.

 

자바 코드를 컴파일 하여 .class 바이트 코드로 만들면 이 코드가 자바 가상 머신 환경에서 실행됩니다.

 

JVM은 자바 실행 환경 JRE( Java Runtime Environment )에 포함되어 있습니다.

 

사용하는 운영체제에 맞는 자바 실행환경 JRE가 설치되어 있다면 자바 가상 머신이 설치되어 있다는 뜻입니다.

 

 

자바 가상 머신(JVM)의 동작방식

 

 

  1. 자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당합니다.
  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일합니다.
  3. Class Loader를 통해 JVM Runtime Data Area로 로딩합니다.
  4. Runtime Data Area에 로딩된 .class들은 Excution Engine을 통해 해석합니다.
  5. 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행하며 이 과정에서 Execution Engine에 의해 GC( Garbage Collection )의 작동과 스레드 동기화가 이루어집니다.

 

JVM의 구조

 

클래스 로더 (Class Loader)

자바는 동적으로 클래스를 읽어오기에 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결됩니다.

이렇게 동적으로 클래스를 로딩해 주는 역할을 하는 것이 클래스 로더입니다.

자바에서 소스 작성시 .java 파일이 생성되고, 컴파일 하면 .class 파일이 생성되는데 클래스로더가 .class 파일을 묶어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재합니다.

 

 

실행 엔진 (Execution Engine)

 

Runtime Data Area로 .class파일을 적재한 후 JVM이 Method Area의 바이트 코드를 실행 엔진에 제공하여 정의된 내용대로 바이트 코드를 실행시킵니다.

이때, 로드된 바이트코드를 실행하는 런타임 모듈이 실행 엔진입니다.

 

 

가비지 컬렉터 ( Garbage Collector )

 

가비지 컬렉터는 더는 사용하지 않는 메모리를 자동으로 회수해 주는 역할을 합니다.

이를 통해 개발자가 따로 메모리를 관리하지 않고 더욱 손쉽게 프로그래밍을 할 수 있도록 도와줍니다.

힙 영역에 참조되지 않은 객체들을 탐색해 제거하는 방식으로 이루어지며 해당 역할을 하는 시간은 알 수 없습니다.

GC역할을 수행하는 스레드를 제외한 나머지 모든 스레드는 일시정지 상태가 됩니다.

 

 

 

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

자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다.

 

 

모든 스레드가 공유해서 사용 ( GC의 대상 )

  • 힙 영역( Heap Area )
  • 메서드 영역( Method Area )

 

스레드마다 하나씩 생성

  • 스택 영역( Stack Area )
  • PC 레지스터( PC Register )
  • 네이티브 메서드 스택( Native Method Stack )

 

메서드 영역

 

클래스 멤버 변수 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 Type 정보, Constant Pool, static 변수, final class 등이 생성되는 영역입니다.

 

힙 영역

 

  1. new 키워드로 생성된 객체와 배열이 생성되는 영역입니다.
  2. 주기적으로 GC가 제거하는 영역입니다.

 

힙 영역은 효율적인 GC를 위해 위와 같이 크게 3가지 영역으로 나뉘게 됩니다.

 

  • Young Generation 영역
    • 자바 객체가 생성되자마자 저장되고 생긴 지 얼마 안 된 객체가 저장되는 공간입니다.
    • 객체 생성 시 최초 Eden 영역에 할당된 후, 참조 정도에 따라 Survivor의 빈 공간으로 이동되거나 회수됩니다.
  • Tenured Generation 영역
    • Young Generation 영역이 차게 되면 참조 정도에 따라 Old영역으로 이동되거나 회수됩니다.
    • Old 영역 메모리가 허용치를 넘게 되면 모든 객체를 검사해 참조되지 않는 객체를 삭제하는 GC가 실행됩니다. → Major GC
    • 시간이 오래 걸리는 작업이기에 GC를 실행하는 스레드를 제외한 모든 스레드는 작업을 멈춥니다. ('Stop-the-World')
  • Permanent Generation 영역
    • 응용프로그램에서 사용되는 클래스와 함수를 설명하기 위한 메타데이터를 보관하는 장소입니다.
    • 런타임에 JVM에 의해서 할당됩니다.
    • Java SE 라이브러리 클래스와 함수들도 이곳에 저장됩니다.

 

PC 레지스터

 

스레드가 생성될 때마다 생성되는 영역으로 프로그램 카운터, 현재 스레드가 실행되는 부분의 주소와 명령을 저장하는 영역입니다.

 

 

네이티브 메서드 스택

 

  1. 자바 이외 언어로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역으로 일반적인 C스택을 사용합니다.
  2. 보통 C/C++ 등의 코드를 수행하기 위한 스택을 말하며 (JNI) 자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 역할을 하는 것이 자바 인터프리터(interpreter)입니다.

 

 

 

 

[ 참고 자료 ]

728x90
반응형

댓글