📌Java 프로그램 실행 과정
- 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받는다. (JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.)
- 자바 컴파일러가 자바 파일(.java)을 자바 바이트 코드(.class)로 변환한다.
- Class Loader를 통해 자바 바이트 코드를 JVM으로 로딩한다.
- 해석된 바이트 코드는 런타임 데이터 영역에 배치되어 JVM의 메모리에 올라가고, 실질적인 수행이 이루어지게 된다.
- 실행 과정 속에서 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
실행 과정
- Java 컴파일러는 소스코드(
.java
파일)를 컴파일해서 바이트 코드(Byte Code)(.class
)를 생성한다.
(OS가 인식할 수 있는 기계어로 바로 컴파일 되는게 아니라 JVM이 인식할 수 있는 바이트 코드(.class
)로 변환된다.)
- JVM은 이 바이트 코드를 사용하고 있는 운영체제에 맞는 실행 파일로 바꿔서 실행시킨다.
특징
- Java는 크로스 플랫폼을 지원하는 언어이며, 이는 Java 프로그램이 컴퓨터 안에서 바로 실행되지 않고, JVM(Java Virtual Machine)이라는 가상의 공간에서 실행되기 때문에 가능하다.
- 하나의 바이트 코드로 JVM이 설치되어 있는 모든 플랫폼에서 동작이 가능하다.
- Java 소스코드를 한번만 컴파일 해도 되기 때문에 유지 보수 면에서, 그리고 다양한 운영체제를 지원하는데 있어서 훨씬 편리하다.
📝면접 대비
Q. JVM에 대해 말씀해주세요
A.