[JAVA기초] JVM이란?

junghan·2023년 4월 6일
1

JAVA

목록 보기
2/12
post-thumbnail

JVM이란?

Java Virtual Machine의 줄임말인 JVM은 OS에 종속받지 않고 CPU가 JAVA를 인식, 실행할 수 있게 하는 가상 컴퓨터입니다.
그렇기 때문에, JAVA언어는 JVM에 의해 "운영체제에 독립적"이라는 장점을 가질 수 있게됩니다.

컴파일 과정

위의 동작처럼 Java 소스코드, 즉 원시코드(*.java)는 CPU가 인식을 하지 못하므로 기계어로 컴파일을 해줘야합니다.

하지만 Java는 이 JVM 이라는 가상머신을 거쳐서 OS에 도달하기 때문에 OS가 인식할 수 있는 기계어로 바로 컴파일 되는게 아니라 JVM이 인식할 수 있는 Java bytecode(*.class)로 변환됩니다.

💡 여기서 Java compiler는 JDK를 설치하면 bin 에 존재하는 javac.exe입니다. (즉, JDK에 Java compiler가 포함되어 있다는 소리임)
javac 명령어를 통해 .java를 .class로 컴파일 할 수 있다

변환된 bytecode는 기계어가 아니기 때문에 OS가 해석할 수 없기 때문에, JVM을 통해 Byte Code를 OS가 해석할 수 있는 기계어(Binary Code)로 변환합니다.

$ javac testcode.java
$ java testcode <== .class 파일

"HELLO WORLD"

이렇게 JAVA 언어로 작성한 소스파일은 바로 운영체제로 가는 것이 아닌, "JVM을 거쳐서 운영체제와 상호작용"을 하는데,
이 때문에 개발자가 소스코드를 작성하는 것에 있어서 "운영체제로부터 독립적"일 수 있게 됩니다.

"Write Once, Read Anywhere"


JVM의 구성

JVM은 크게 아래와 같이 이루어져 있습니다.

  • 클래스 로더(Class Loader)
  • 실행 엔진(Execution Engine)
    • 인터프리터(Interpreter)
    • JIT 컴파일러(Just-in-Time)
    • 가비지 콜렉터(Garbage collector)
  • 런타임 데이터 영역 (Runtime Data Area)

클래스 로더

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

실행 엔진

클래스를 실행시키는 역할을 합니다.

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

자바 바이트 코드(*.class)는 기계가 바로 수행할 수 있는 언어보다는 비교적 인간이 보기 편한 형태로 기술된 것입니다. 그래서 위에서 설명했듯이 실행 엔진은 이와 같은 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경합니다.

  • 인터프리터
    실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행합니다. 하지만 한 줄씩 수행하기 때문에 느리다는 단점이 있습니다.

  • JIT(Just-In-Time)
    인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 해당 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식입니다.
    JIT 컴파일러가 컴파일하는 과정은 바이트 코드를 인터프리팅하는 것보다 훨씬 오래걸리므로 한 번만 실행되는 코드라면 컴파일 하지 않고 인터프리팅하는 것이 유리합니다.

  • 가비지 콜렉터
    더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제합니다.


JDK, JRE, JVM

DK, JRE, JVM은 모두 자바(Java) 개발 및 실행 환경과 관련된 용어들입니다. 이들은 서로 다른 역할을 가지며 자바 애플리케이션 개발과 실행에 필요한 요소들입니다. 이제 JDK, JRE, JVM의 개념과 그들 간의 관계에 대해 자세히 설명하겠습니다.

JDK (Java Development Kit):

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

  • 자바 컴파일러(Java Compiler): 자바 소스 코드를 바이트 코드로 변환합니다.
  • 자바 런타임 환경(JRE): 자바 애플리케이션을 실행하기 위해 필요한 실행 환경이 포함되어 있습니다.
  • 자바 개발 도구(Java Development Tools): 디버깅, 문서화, 프로파일링 등 개발 과정을 지원하는 도구들이 제공됩니다.
    JDK는 개발자가 자바 애플리케이션을 만들고 테스트하는 데 필수적입니다.

JRE (Java Runtime Environment):

JRE는 자바 애플리케이션을 실행하기 위해 필요한 최소한의 실행 환경을 제공합니다. JRE에는 JVM(Java Virtual Machine)과 Java 라이브러리들이 포함되어 있습니다. JRE는 다음과 같은 기능을 담당합니다:

  • JVM(Java Virtual Machine): 바이트 코드를 기계어로 변환하고, 메모리 관리와 프로세스 관리를 처리하여 자바 애플리케이션을 실행합니다.
  • 자바 클래스 라이브러리: 자바 개발자들이 자주 사용하는 클래스들을 제공합니다. 이러한 라이브러리는 자바 애플리케이션 개발 시에 기본적으로 활용됩니다.
    JRE는 자바 애플리케이션을 실행하는 데 필요하며, JDK를 설치하면 JRE도 함께 포함됩니다.

JVM (Java Virtual Machine):

위에서 설명했듯이 JVM은 자바 바이트 코드를 실행하는 가상 머신입니다. 바이트 코드는 자바 컴파일러에 의해 생성되며, 특정 하드웨어 플랫폼이 아닌 JVM 위에서 동작합니다. 이는 자바의 크로스 플랫폼(Platform-Independent) 특성을 가능하게 합니다. JVM은 다음과 같은 주요 기능을 담당합니다:

  • 바이트 코드 해석: 컴파일된 바이트 코드를 읽고 실행 가능한 기계어로 변환합니다.
  • 메모리 관리: 자동적으로 메모리를 할당하고 해제하여 프로그램 실행 중 메모리 관리를 용이하게 합니다.
  • 가비지 컬렉션: 사용되지 않는 객체들을 자동으로 제거하여 메모리를 최적화합니다.

요약하면, JDK는 자바 애플리케이션 개발을 위해 필요한 도구들의 집합이며, JRE는 자바 애플리케이션을 실행하기 위한 최소한의 실행 환경을 제공하며, JVM은 자바 바이트 코드를 실행하는 가상 머신입니다.
이들은 자바 애플리케이션의 개발과 실행을 위해 서로 밀접하게 연관되어 있습니다. 개발자는 JDK로 코드를 작성하고 컴파일한 뒤, JRE를 통해 자바 애플리케이션을 실행할 수 있습니다. JVM은 JRE에 포함되어 있으며, JRE를 통해 자바 애플리케이션을 JVM 위에서 실행합니다. 이를 통해 자바는 여러 플랫폼에서 동일한 방식으로 동작할 수 있게 됩니다.

JVM 설명1 - tpoint
JVM 설명2

profile
42seoul, blockchain, web 3.0

0개의 댓글