JVM

KDG: First things first!·2024년 7월 22일

Java

목록 보기
1/4

JVM이란

JVM이란 Java Virtual Machine의 약자로 "자바 가상 머신"이라는 의미이다. 쉽게 말해서 어느 기기 위에서나 Java 프로그램을 실행시킬 수 있는 하나의 가상 기기를 만들어주는 프로그램이다.

JVM 덕분에 우리는 PC든 모바일이든 서버든 어느 환경에서나 쉽게 Java를 사용할 수 있다.

관련 필수 용어 정리(Byte Code)

바이트 코드: Java 컴파일러가 내가 작성한 코드를 운영 체제가 읽을 수 있는 코드인 바이트 코드로 컴파일(변환)한 코드들을 의미한다.

Java 컴파일러: 내가 작성한 Java 코드들(.java 파일)을 운영체제가 해독할 수 있도록 바이트 코드(.class)로 변환시켜주는 변환기이다.

인터프리터: 운영체제가 읽은 바이트 코드(.class)들을 기계가 실행할 수 있는 기계어(로우 레벨 언어)로 변역해주는 번역기이다.>

JIT 컴파일러: Just-In-Time(즉시, 실시간)의 약자로 인터프리터를 보조하여 인터프리터의 작업 효율을 높여주는 서포터 번역기이다.

메모리 영역: OS 안에서 JVM이 동작하기 위해서는 OS가 JVM에 할당한 영역으로 쉽게 말해 Java에서의 데이터를 저장하는 영역이다.

클래스 로더: 컴파일된 바이트 코드(.class)들을 메모리 영역으로 운반하는 역할을 담당한다. 메모리 영역에 바이트 코드들을 불러와 메모리에 저장한다.

런타임 시스템: 프로그램이 실행될 때의 환경과 그 환경에서 프로그램이 올바르게 작동하도록 지원하는 소프트웨어 및 하드웨어 구성 요소이다.
주요 역할로는 메모리 관리, 입출력 관리, 예외 처리, 스레드 및 프로세스 관리, 성능 최적화 등이 있다.

가비지 컬렉터: 메모리 누수(Memory Leak)가 발생하지 않게 메모리에 존재하는 데이터 중 더 이상 사용되지 않는 것이라고 판단되는 데이터들을 주기적으로 청소하는 내장 프로그램


JVM의 작동 과정을 설명하면 다음과 같다.

사용자가 열심히 자바 코드를 짜서 만든 파일(.java )을 자바 컴파일러가 바이트 코드로 바꿔 놓으면(.class) 클래스 로더가 JVM 메모리 공간으로 가져간다. 이후 메모리 영역에서 JIT 컴파일러와 자바 인터프리터가 바이트 코드 파일을 기계가 이해할 수 있는 수준의 로우 레벨로 해석을 해준 후 런타임 시스템으로 넘긴다.이후 OS를 거쳐 하드웨어에 이관된다. 이 때 이관을 하는 과정에서 더 이상 필요없다고 판단되는 변수, 객체 등의 메모리들을 가비지 컬렉터가 청소하여 메모리리 영역을 관리한다.




JVM 환경 구성하기(JRE와 JDK)

개발환경을 구성하기 위해서는 필요한 프로그램들을 준비하여 JVM 환경을 구성해야 한다.

JRE: Java Runtime Environment(자바 실행 환경)의 약자로 말 그대로 자바를 실행할 수 있는 환경이다. JRE 안에 JVM이 들어있어 바이트 코드인 .class 파일을 실행할 수 있지만 자바 컴파일러가 없어 .java 파일을 변환할 수 없다는 한계가 존재한다.
JVM에다가 java.lang, java.util, java.io 등의 Java API를 제공하는 클래스 라이브러리가 들어있는 구성이다.

JDK: Java Development Kit(자바 개발 키트)의 약자로 JVM은 물로 JRE도 포함되어 있다. JRE처럼 .class 파일을 실행할 수 있을 뿐만 아니라 .java 파일을 .class 파일로 변환시킬 수 잇는 자바 컴파일러(Java Complier)까지 포함하고 있어 컴파일이 가능하다. 또한 jdb(Java Debugger)도 포함하고 있어 Java 애플리케이션의 실행 중 오류를 찾고 수정하는 데 도움을 주는 디버깅 기능도 갖고 있다.

JDK의 역할을 구분하자면
1. 자바 코드(.java)를 OS가 읽을 수 있는 바이트 코드(.class)로 변환시켜 주는 컴파일러 역할
2. 자바가 실행될 수 있는 자바 실행 환경(Java Runtiem Environment, JRE)를 제공한다.
3. JDB(Java DeBugger)를 통해 실행 중 오류를 찾을 수 있는 디버깅 역할을 제공한다.

profile
알고리즘, 자료구조 블로그: https://gyun97.github.io/

0개의 댓글