[Java] JVM이란?

유네스코d·2023년 5월 23일
0

Java

목록 보기
1/4

📌Java 프로그램 실행 과정

  1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받는다. (JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.)
  2. 자바 컴파일러가 자바 파일(.java)을 자바 바이트 코드(.class)로 변환한다.
  3. Class Loader를 통해 자바 바이트 코드를 JVM으로 로딩한다.
  4. 해석된 바이트 코드는 런타임 데이터 영역에 배치되어 JVM의 메모리에 올라가고, 실질적인 수행이 이루어지게 된다.
  5. 실행 과정 속에서 JVM은 필요에 따라 GC와 같은 관리 작업을 수행한다.

📌JVM (Java Vertual Machine)

  • Java로 작성된 프로그램을 실행시켜주기 위한 가상 컴퓨터라고 할 수 있다.
  • JVM이 OS와 프로그램 사이에 위치하여 OS, HW의 종류에 상관 없이 프로그램을 실행할 수 있도록 도와준다.

특징

JVM 덕분에
'한 번 작성하면 모든 곳에서 실행한다',
Write Once Run Anywhere(W-O-R-A)가 자바의 원칙이 될 수 있다.

  • Java는 OS에 종속적이지 않다는 특징을 가지고 있다.
    → JVM이 OS와 프로그램 사이에 위치하여 OS, HW의 종류에 상관 없이 프로그램을 실행할 수 있도록 도와준다.
  • JVM을 사용하면 하나의 바이트 코드(.class)로 모든 플랫폼에서 동작하도록 할 수 있다.

Byte Code(.class 파일)?

  • JVM이 이해할 수 있는 언어로 변환된 자바 소스코드
  • 사람이 쓰는 자바 코드와 컴퓨터가 읽는 기계어의 중간 단계
  • 기계어가 아니기 때문에 OS에서 바로 실행되지 않음
  • OS가 Byte Code를 이해할 수 있도록 JVM이 해석해줌

구조

자바 컴파일러가 바이트 코드로 변환하는 과정을 거치면 JVM 내부의 클래스 로더로 들어오게 된다.

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

Java 컴파일러에 의해 변환된 바이트 코드를 읽고 한 줄씩 기계어로 해석하는 역할

2. 클래스 로더(Class Loader)

Java는 동적으로 클래스를 읽어오기 때문에 런타임에서 JVM과 연결된다.
클래스 로더(class loader)는 한 번에 메모리에 모든 클래스를 로드하는 것이 아닌, 필요한 순간에 해당 클래스(.class) 파일을 찾아 메모리에 로딩해주는 역할을 한다.

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

코드를 실행 시점(런타임)에 그때그때 기계어로 통번역 해주는 방식이다.
자주 사용되는 메소드의 경우, 컴파일하고 기계어를 캐싱하여 해당 메소드가 여러 번 호출될 때 매번 해석하는 것을 방지한다.

4. 가비지 컬렉터(Garbage Collector)

사용하지 않거나 필요없는 객체들을 메모리에서 소멸시키는 역할을 한다. 메모리 관리를 자동으로 해줘서 개발자가 비즈니스 로직에 더 집중할 수 있게 도와준다.

5. 런타임 데이터 영역(Runtime Data Area)

JVM의 메모리 영역으로, 자바 프로그램을 실행할 때 사용되는 데이터들을 적재하는 영역이다.


📌C언어 vs Java

C언어

  • C언어로 작성한 소스를 다른 기종의 컴퓨터에서 실행하려면 소스와 각 기종용 컴파일러를 준비해야 한다.
  • C언어로 프로그램을 짜고 윈도우 버전, 맥 버전, 리눅스 버전을 만들기 위해서 각각의 컴파일러로 3번 컴파일을 해야 한다.
    → 프로그램 규모가 큰 경우에 부담이 될 수 있으며, 수정할 때마다 3번씩 컴파일해야 한다.

Java

실행 과정

  1. Java 컴파일러는 소스코드(.java 파일)를 컴파일해서 바이트 코드(Byte Code)(.class)를 생성한다.
    (OS가 인식할 수 있는 기계어로 바로 컴파일 되는게 아니라 JVM이 인식할 수 있는 바이트 코드(.class)로 변환된다.)
  2. JVM은 이 바이트 코드를 사용하고 있는 운영체제에 맞는 실행 파일로 바꿔서 실행시킨다.

특징

  • Java는 크로스 플랫폼을 지원하는 언어이며, 이는 Java 프로그램이 컴퓨터 안에서 바로 실행되지 않고, JVM(Java Virtual Machine)이라는 가상의 공간에서 실행되기 때문에 가능하다.
  • 하나의 바이트 코드로 JVM이 설치되어 있는 모든 플랫폼에서 동작이 가능하다.
  • Java 소스코드를 한번만 컴파일 해도 되기 때문에 유지 보수 면에서, 그리고 다양한 운영체제를 지원하는데 있어서 훨씬 편리하다.



📝면접 대비

Q. JVM에 대해 말씀해주세요

A.

profile
yune's coding

0개의 댓글