[Java] JVM에 대하여

아래 글들은 https://d2.naver.com/helloworld/1230로 공부하며 정리하였습니다.

JVM Internal

자바 바이트코드는 JRE 위에서 동작한다. 이 JRE에는 자바 바이트코드를 해석하고 실행하는 JVM(Java Virtual Machine)이 있다. JRE는 자바 APIJVM으로 구성되며, JVM의 역할은 자바 어플리케이션을 Class Loader를 통해 읽어들여 자바 API와 함께 실행하는 것이다.

Vitual Machine

프로그램을 실행하기 위해 컴퓨터와 유사한 기계를 소프트웨어로 구현한 것이라 할 수 있다. 원래 자바는 WORA(Write Once Run Anywhere)를 구현하기 위해 물리적인 머신과 별개의 가상 머신을 기반으로 동작하도록 설계되었다. 그래서 자바 바이트코드를 실행하고자 하는 모든 하드웨어에 JVM을 동작시킴으로써 자바 실행 코드를 변경하지 않고도 모든 종류의 하드웨어에서 동작되게 한 것이다.

JVM의 특징

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