JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가

ahnjs·2022년 1월 9일
0
post-thumbnail

자바와 스프링프레임워크를 기반으로 개발을 하고 있으나 언어에 대한 깊은 이해도 없이 개발하고 있다고 느껴져 진행하는 스터디.
백기선님이 진행하신 스터디 주제로 개인적으로 블로그에 작성하는 방법으로 진행.

목표

자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.

학습내용

  • JVM이란 무엇인가
  • 컴파일 하는 방법
  • 실행하는 방법
  • 바이트코드란 무엇인가
  • JIT 컴파일러란 무엇이며 어떻게 동작하는지
  • JVM 구성 요소
  • JDK와 JRE의 차이

JVM이란 무엇인가

JVM이란?

자바 가상 머신(Java Virtual Machine, JVM)은 자바 바이트코드를 실행할 수 있는 주체이다. 일반적으로 인터프리터나 JIT 컴파일 방식으로 다른 컴퓨터 위에서 바이트 코드를 실행할 수 있도록 구현되나 jop 자바 프로세서처럼 하드웨어와 소프트웨어를 혼합해 구현하는 경우도 있다 (이론적으로 100% 하드웨어 구현도 가능하나 비효율적) 자바 바이트 코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는 이론적으로 모든 자바 프로그램은 CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.

컴파일하는 방법

자바 컴파일러(Java Compiler)가 자바를 가지고 작성한 자바 소스코드를 자바 가상 머신이 이해할 수 있는 자바 바이트 코드로 변환하는 과정. 바이트 코드의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있다.

실행하는 방법

java fileName.class

위 명령어로 실행할 떄 JVM의 구성요소인 클래스로더가 fileName.class 파일을 메모리상의 JVM으로 가져온다.
내부적으로는 classLoader -> Byte Code Verifier (바이트코드 변조 확인) -> Execution Engine에서 실행되는 구조다. Execution Engine에서 클래스파일(바이트코드로 구성)을 기계어로 변경해서 명령어 단위로 실행한다. 다만 명령어 단위 실행은 2가지 방식으로 동작한다

  • interpreter 방식 : 명령어를 하나씩 수행 하는 방식
  • JIT(Just In Time compiler) 방식 : 전체 바이트코드를 네이티브 코드로 변환하고 그 이후에는 네이티브 코드로 실행하는 방식

바이트 코드란 무엇인가

자바 바이트 코드(Java bytecode)란 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다.
자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불리고 있다.
이러한 자바 바이트 코드의 확장자는 .class이다.
자바 바이트 코드는 자바 가상 머신만 있다면, 어떤 운영체제에서도 실행될 수 있다.

JIT 컴파일러란 무엇이며 어떻게 동작하는지

인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식이다. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실항하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠르다.

JVM 구성 요소

  1. 자바 인터프리터(interpreter)
  2. 클래스 로더(class loader)
  3. JIT 컴파일러(Just-In-Time compiler)
  4. 가비지 컬렉터(garbage collector)

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

자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결된다. 이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 바로 클래스 로더이다.

JIT 컴파일러란 프로그램이 실행 중인 런타임에 실제 기계어로 변환해 주는 컴파일러를 의미한다. 동적 번역(dynamic translation)이라고도 불리는 이 기법은 프로그램의 실행 속도를 향상시키기 위해 개발되었다. 즉, JIT 컴파일러는 자바 컴파일러가 생성한 자바 바이트 코드를 런타임에 바로 기계어로 변환하는 데 사용한다.

자바 가상 머신은 가비지 컬렉터를 이용하여 더는 사용하지 않는 메모리를 자동으로 회수한다. 따라서 개발자가 따로 메모리를 관리하지 않아도 되므로, 더욱 손쉽게 프로그래밍을 할 수 있도록 도와준다.

JDK와 JRE의 차이

JRE는 자바 어플리케이션을 수행하기 위한 SW(JVMrhk Class Libraries등 최소한의 환경)라고 볼 수 있고, JDK는 JRE + 개발에 필요한 SW를 모아 놓은 좀 더 큰 범위의 SW라고 볼 수 있다. 따라서 자바 어플리케이션을 개발하기 위해서는 (컴파일, 디버깅, Doc 문서 생성 등) JDK를 필수로 설치 해야 한다.


ref

https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0
https://gyoogle.dev/blog/computer-language/Java/%EC%BB%B4%ED%8C%8C%EC%9D%BC%20%EA%B3%BC%EC%A0%95.html
https://gblee1987.tistory.com/173

0개의 댓글