자바 JVM과 바이트 코드

임재성
3 min readAug 12, 2019

--

JVM/byte Code

JVM 이란?

● JVM이란 Java Virtual Machine의 약자.
● 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행.
● 자바 프로그램이 어느 운영체제 위에서도 동일하게 작동할 수 있게 해줌.
(단, 자바 프로그램과 달리 JVM은 운영체제에 종속되므로, 각 운영체제에 맞는 JVM이 설치되어야 함.)
● 메모리를 자동으로 관리해주는 기능을 갖고있음.(가비지 컬렉션)
● 포인터를 지원하되 C와 같이 주소 값을 임의로 조작이 가능한 포인터 연산이 불가능

자바 바이트 코드

● JVM이 이해할 수 있는 언어로 변환된 자바 소스코드를 의미.
● 자바 컴파일러에 의해 변환되는 코드의 명령어의 크기가 1byte라서 자바 바이트 코드라고 불림.
● 자바 바이트 코드는 자바 가상 머신만 설치되어 있다면 어느 운영체제에서도 실행 가능.

자바 가상 머신의 구성

자바 가상 머신(JVM)은 다음과 같이 구성됩니다.

1. 자바 인터프리터(interpreter)

2. 클래스 로더(class loader)

3. JIT 컴파일러(Just-In-Time compiler)

4. 가비지 컬렉터(garbage collector)

자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 역할을 하는 것이 자바 인터프리터(interpreter)입니다.

자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결됩니다.
동적으로 읽어온다는 것은 런타임시에 모든 코드가 JVM에 링크 되는 것을 의미.

이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 바로 클래스 로더(class loader)입니다.

JIT 컴파일러(Just-In-Time compiler)란 프로그램이 실행 중인 런타임에 실제 기계어로 변환해 주는 컴파일러를 의미합니다.

동적 번역(dynamic translation)이라고도 불리는 이 기법은 프로그램의 실행 속도를 향상시키기 위해 개발되었습니다.

즉, JIT 컴파일러는 자바 컴파일러가 생성한 자바 바이트 코드를 런타임에 바로 기계어로 변환하는 데 사용합니다.

자바 가상 머신은 가비지 컬렉터(garbage collector)를 이용하여 더는 사용하지 않는 메모리를 자동으로 회수해 줍니다.

따라서 개발자가 따로 메모리를 관리하지 않아도 되므로, 더욱 손쉽게 프로그래밍을 할 수 있도록 도와줍니다.

JVM 실행과정

  1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당 받는다. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
  2. 자바 컴파일러(javac)가 자바소스(.java)코드를 읽어 들여 자바 바이트코드(.class)로 변환시킨다.
  3. 이 변경된 Class 파일들을 Class Loader를 통해 JVM 메모리영역(Runtime Data Areas) 영역으로 로딩한다.
  4. 로딩된 class파일들은 Execution engine을 통해 해석된다.
  5. 해석된 바이트코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어지게된다.
    이러한 실행과정속에서 JVM은 필요에 따라 Thread Synchronization과 GC같은 관리 작업을 수행한다.

--

--