JAVA

JVM이란?

euicheol0910 2025. 4. 16. 10:01

JVM이란, Java Virtual Machine의 줄임말로 JAVA가 OS에 종속되지 않고 CPU가 인식하고 실행할 수 있도록 해주는 가상컴퓨터이다. 이로 인해 자바는 JVM으로 인해 운영체제에 독립적이라는 장점을 가질 수 있다.

 

 

컴파일과정

 

.java 형식의 소스코드 파일은  컴파일러를 통해 곧바로 기계어로 변환되지 않는다.  자바파일은 JVM을 거쳐 OS에 도달하기 때문에 Java compiler는 JVM이 인식할 수 있는 .class 형식의 바이트 코드로 변환을 한다. 

 

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

 

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

 

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

 

 

JVM의 특징

 

  • 스택 기반의 가상 머신
    • 대표적인 컴퓨터 아키텍처인 인텔 x86 아키텍처나 ARM 아키텍처와 같은 하드웨어가 레지스터 기반으로 동작하는 데 비해 JVM은 스택 기반으로 동작한다.
  • 심볼릭 레퍼런스
    • 참고하는 클래스의 특정 메모리 주소를 참조 관계로 구성한 것이 아니라, 참조하는 대상의 이름만을 지칭한 것이다. 자바 바이트 코드(.class)가 JVM에 올라가게 되면 심볼릭 레퍼런스는 이름에 맞는 객체의 물리적인 주소를 찾아서 연결하는 작업을 수행한다.
    • 기본 자료형을 제외한 모든 타입을 명시적인 메모리 주소 기반의 레퍼런스가 아니라 심볼릭 레퍼런스를 통해 참조한다.
  • 가비지 컬렉션
    • 클래스 인스턴스는 사용자 코드에 의해 명시적으로 생성되고 가비지 컬렉션에 의해 자동으로 파괴된다.
  • 기본 자료형을 명확하게 정의하여 플랫폼 독립성 보장
    • C/C++ 등의 전통적인 언어는 플랫폼의 따라 int 형의 크기가 변한다. 반면 JVM은 기본 자료형을 명확하게 정의하여 호환성을 유지하고 플랫폼 독립성을 보장한다.
  • 네트워크 바이트 오더
    • 자바 클래스 파일은 네트워크 바이트 오더를 사용한다. 인텔 x86 아키텍처가 사용하는 리틀 엔디안이나 RISC 계열 아키텍처가 주로 사용하는 빅 엔디안 사이에서 플랫폼 독립성을 유지하려면 고정된 바이트 오더를 유지해야하므로 네트워크 전송 시에 사용하는 바이트 오더인 네트워크 바이트 오더를 사용한다. 네트워크 바이트 오더는 빅 엔디안이다.

JVM의 구성

 

클래스 로더

 

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

 


실행 엔진

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

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

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

 

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

 

 

사진출처: https://velog.io/@jungmyeong96/JAVA%EA%B8%B0%EC%B4%88-JVM%EC%9D%B4%EB%9E%80

'JAVA' 카테고리의 다른 글

자바 오버로딩 , 오버라이딩  (2) 2025.04.18
자바의 특성(장점)  (2) 2025.04.17
접근제한자  (0) 2025.01.08
변수(JAVA)  (0) 2025.01.02
Eclipse,JDK 다운로드 및 환경 설정  (0) 2024.12.30