본문 바로가기
언어 공부/Java

[Java] JVM과 자바 코드 실행

by 희조당 2022. 8. 8.
728x90

✍️ 학습 목표

  • JVM
  • 컴파일 방법
  • 실행 방법
  • 바이트코드
  • JIT 컴파일러
  • JVM 구성 요소
  • JDK와 JRE

📌JVM이란?

Java Virtual Machine의 약자로 자바를 실행하기 위한 가상 머신이다. Java는 완전한 기계어가 아니고 바이트 코드라서 해석하고 실행할 수 있는 가상의 OS가 필요하다. 이 역할을 해주는 것이 JVM이다.

✔️ JVM의 기능

  1. 자바 프로그램이 어느 환경에서도 실행될 수 있게 한다.
  2. 프로그램 메모리를 관리하고 최적화한다.
  • JVM는 '가비지 컬렉션'이란 프로세스를 통해 메모리를 관리한다. 이 가비지 컬렉션은 이름에서 알 수 있듯이 사용되지 않는 메모리를 정리한다. 따라서, JVM이 메모리를 효율적으로 관리하고 최적화한다는 것이다.
  • Java는 OS에 독립적이지만, JVM은 OS에 독립적이지 못하다.
  • 따라서 OS에 맞는 JVM을 사용해야 한다는 특징이 있다.

📌컴파일 방법

Java 컴파일러는 JDK를 설치하면 JDK의 bin 폴더 속 javac.exe라는 실행 파일 형태로 설치된다.

기존에 작성한 자바 소스파일(*.java)을 터미널 창에서 javac 명령어를 통해서 컴파일할 수 있다.

C:\Users\gmlwh\Desktop>javac test.java

컴파일 완료 시 같은 디렉토리에 .class파일이 생성된다.

💡 참고 (Java 컴파일 과정)

  1. 개발자가 Java로 코드를 작성하면 자바 소스코드(*.java)가 생성된다.
  2. JVM 때문에 바로 기계어로 컴파일하지 않고 JVM이 이해할 수 있는 자바 바이트코드(*.class)로 변환된다.
  3. 바이트코드는 JVM의 클래스 로더에게 전달되고 로더는 필요한 클래스들을 로딩 및 링크하여 메모리에 올린다.
  4. 실행 엔진이 메모리에 올라온 바이트 코드를 명령어 단위로 가져와서 실행한다.


📌실행 방법

javac 명령어로 생성된 자바 바이트코드(*.class)를 java 명령어로 실행시킬 수 있다.

C:\Users\gmlwh>cd Desktop
C:\Users\gmlwh\Desktop>java test

java 명령어는 사실 JVM을 실행시키는 명령어이다.


📌바이트코드란?

자바 가상 머신(JVM)이 이해할 수 있는 자바 소스코드(*.java)가 변환된 코드이다.

또한, 변환된 코드의 명령어 크기가 1바이트라서 바이트코드라고 불리고 있다. 확장자는 .class이다.


📌JIT 컴파일러란?

  • 바이트코드가 변경될 때 인터프리터와 JIT 컴파일러를 이용해서 변경된다.
  • JIT 컴파일러의 JIT는 Just-In-Time의 약자로 이 컴파일러는 적절한 시간에 바이트코드 전체를 컴파일해서 인터프리터의 단점을 보완하기 위해서 만들어졌다.
  • 무조건 컴파일하는 것이 빠른 것이 아니고 무조건 인터프리팅하는게 빠른 것이 아니기 때문에 JVM 내부 메서드가 수행 빈도를 체크해 일정 정도를 넘길 시 컴파일한다.

📌JVM 구성요소

JVM은 크게 3가지로 구성되어있다.

✔️ 클래스 로더 (Class Loader)

  • Java의 클래스들은 런타임에 처음 참조될 때 해당 클래스는 로드되고 링크된다.
  • 이 동적 로드를 클래스 로더가 담당한다.

✔️ 실행 엔진 (Execution Engine)

  • 말 그대로 실행시키는 역할이다.
  • 클래스 로더가 메모리에 바이트코드를 배치시키면 이 코드를 실행 엔진이 실행시킨다.
  • 인터프리터, JIT 컴파일러, GC (garbage collector)로 구성되어있다.

✔️ 런타임 데이터 영역 (Runtime Data Area, = 메모리)

  • JVM의 메모리 영역으로, 프로그램을 수행하기 위해 OS로부터 할당받은 공간이다.

📌JDK vs JRE

✔️ JDK (Java Development Kit) : JRE + 개발 툴

  • JRE와 개발에 필요한 툴들 합친 것을 의미.
  • Java 11부터 오라클에서 JDK만 제공한다.

✔️ JRE (Java Runtime Environment) : JVM + 라이브러리

  • Java 애플리케이션을 실행할 수 있도록 구성한 배포판.
  • 개발 관련 도구는 포함하지 않는다.

 

'언어 공부 > Java' 카테고리의 다른 글

[Java] Java의 상속  (2) 2022.08.25
[Java] Java의 클래스  (0) 2022.08.17
[Java] Java 제어문  (0) 2022.08.16
[Java] Java의 연산자  (0) 2022.08.15
[Java] Java의 데이터 타입, 변수 그리고 배열  (0) 2022.08.12

댓글