[CS] JVM(Java Virtual Machine)

말하는 감자·2025년 1월 4일

CS

목록 보기
8/33
post-thumbnail

JVM

Java Virtual Machine의 줄임말인 JVM은 OS의 종속받지 않고 CPU가 JAVA를 인식, 실행할 수 이게 하는 가상 컴퓨터
따라서 JAVA 언어는 JVM에 의해 "운영체제에 독립적" 이라는 장점을 가진다.
Java 프로그램을 OS 대신 실행을 담당하는 역할 수행


위의 동작 처럼 java 소드 코드(원시코드)는 cpu가 인식하지 못하므로 기계어로 컴파일 하는 과정이 필요하다.
하지만, java는 이 jvm 이라는 가상 머신을 거쳐서 OS에 도달하기 때문에 OS가 인식할 수 있는 기계어로 바로 컴파일 되는게 아니라 JVM이 인식할 수 있는 바이트코드로 변환된다.

변환된 바이트코드는 기계어가 아니기 때문에 OS가 해석할 수 없다. 따라서 JVM을 통해 바이트코드를 OS가 해석할 수 있는 기계어로 변환한다.
java 언어로 작성한 소스파일은 바로 운영체제로 가는것이 아닌, JVM을 거쳐서 운영체제와 상호작용을 하는데, 이 때문에 개발자가 소스코드를 작성하는 것에 있어서 운영체제로부터 독립적일 수 있게 되는것

JVM의 구성


클래스 로더 + 실행 엔진(인터프리터, JIT 컴파일러, 가비지 콜렉터) + 런타임 데이터 영역

클래스 로더(Class Loader)

JVM 내로 클래스 파일(바이트코드)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
런 타임시 동적으로 클래스를 로드하고 jar 파일 내 저장된 클래스들을 JVM 위에 탑재한다.
즉, 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크하는 역할

실행 엔진(Execution Engine)

클래스를 실행 시키는 역할
클래스 로더가 JVM 내의 런타임 데이터 영역에 바이트 코드를 배치시키면, 실행 엔진에 의해 실행 할 수 있다.

자바 바이트코드(.class)는 기계가 바로 수행할 수 잇는 언어가 아니기 때문에, 실행 엔진이 바이트 코드를 기계가 실행할 수 있는 언어로 변경한다.

  • 인터프리터
    실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다. 하지만 반복적으로 실행되는 코드에 대해 느리다는 단점(오버헤드가 계속 발생하기 때문)
  • JIT
    인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 더이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식
    JIT 컴파일러가 컴파일하는 과정은 바이트 코드를 인터프리팅 하는것 보다 훨씬 오래 걸리므로, 한 번만 실행되는 코드라면 컴파일 하지 않고 인터프리팅 하는 것이 유리
  • 가비지 콜렉터(Garbage Collector)
    더 이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제

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

JAVA 프로그램이 실행되는 동안 데이터를 저장하고 관리하는 메모리 영역
1. 메서드 영역: 클래스 정보와 관련된 데이터 저장
2. 힙 영역: Java 객체 및 배열이 동적으로 할당되는 메모리 공간
3. 스택 영역: 각 스레드에 대한 메서드 호출과 지역 변수를 저장하는 공간
4. 카운터 영역: java가 아닌 네이티브 메서드를 실행할 때 사용되는 공간

  • 네이티브 메서드: C나 C++로 작성된 메서드를 호출할 수 있는 기능 제공
  1. 프로그램 카운터 레지스터: 현재 실행중인 바이트코드를 추적하는 레지스터

실행 환경(JDK, JRE, JVM)

서로 다른 역할을 가지며 자바 애플리케이션 개발과 실행에 필요한 요소들

JDK

JDK는 자바 애플리케이션을 개발하기 위해 필요한 도구들의 모음. 이 도구들은 자바 개발자가 자바 코드를 작성하고 컴파일하여 실행 가능한 바이트 코드로 변환하는 데 사용된다.

  • 자바 컴파일러: 자바 소스 코드를 바이트 코드로 변환
  • JRE: 자바 애플리케이션을 실행하기 위해 필요한 실행 환경 포함
  • 자바 개발 도구: 디버깅, 문서화, 프로파일링 등 개발 과정을 지원하는 도구들 제공

JRE

JRE는 자바 애플리케이션을 실행하기 위해 필요한 최소한의 실행환경 제공
JRE에는 JVM과 Java 라이브러리들이 포함되어 있다.

  • JVM: 바이트 코드를 기계어로 변환하고, 메모리 관리와 프로세스 관리를 처리하여 자바 애플리케이션 실행
  • 자바 클래스 라이브러리: 자바 개발지들이 자주 사용하는 클래스들 제공

요약

JVM은 자바 바이트 코드를 실행하는 가상 머신. 바이트 코드는 자바 컴파일러에 의해 생성되어 JVM위에서 동작하여, OS에 독립적이라는 장점을 가짐

주요 기능

  • 바이트 코드 해석: 컴파일된 바이트 코드를 읽고 실행 가능한 기계어로 변환
  • 메모리 관리: 가비지 컬렉션
profile
주니어개발자(?)

0개의 댓글