📗 자바 프로그램의 구동 원리
1. 소스코드를 작성한다 (.java 확장자의 소스 파일)
2. 컴파일러(javac.exe)가 바이트코드로 변환한다. (.class 확장자의 클래스 파일)
3. 런처(java.exe)로 자바 가상 머신을 구동시킨다.
4. 자바 가상 머신(JVM)이 바이트코드를 해석하여 자바 프로그램이 실행된다.
Java 는 OS에 종속적이지 않고, OS에 종속받지 않고 실행되도록 OS 위에서 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터가 JVM 이다.
📘JVM의 기본 기능 2가지
1. 자바 프로그램이 어느 기기, 또는 어느 운영체제 상에서도 실행될 수 있도록 한다.
: 자바 프로그램의 클래스 파일들은 운영체제에서 직접 동작하는 것이 아니라 "JVM" 위에서 동작하기 때문에 어느 운영체제에서든 실행 시킬 수 있다.
2. 프로그램 메모리를 관리하고 최적화한다.
JVM 은 힙(Heap)과 스택(Stack)의 메모리 사용을 확인하고, JVM의 메모리 설정 값들을 조율한다.
🌿 가비지 컬렉션(Garbage Collection)
자바 이전에는 프로그래머가 모든 프로그램 메모리를 관리했었다. 자바에서는 JVM이 프로그램 메모리를 관리한다. JVM은 가비지 컬렉션이란 프로세스를 통해 메모리를 관리하며, 이 가비지 컬렉션은 자바 프로그램에서 사용되지 않는 메모리를 지속적으로 찾아내서 제거한다. 가비지 컬렉션은 실행 중인 JVM 내부에서 일어난다.
📚 처음에는 자바만을 위한 자바 가상 머신이었지만, 이제는 Scalar, Groovy, Kotlin 등 많은 언어와 프로그래밍 언어를 지원하고 있다.
📑 JVM의 구조는 다음과 같다.
클래스 로더가 클래스 파일을 동적으로 로드 해 런타임 데이터 영역에 배치하면, 런타임 데이터 영역은 파일들을 각각의 위치에 저장하고, 실행엔진이 런타임 데이터 영역에 배치되어 있는 바이트 코드를 해석하여 실행한다.
✅클래스 로더
JVM 내로 클래스 파일(*.class)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈.
클래스를 로드하고 jar 파일 내 저장된 클래스들을 JVM 위에 탑재한다. 클래스를 처음으로 참조할 때, 클래스를 로드하고 링크한는 역할을 한다.
✅실행 엔진
클래스를 실행시키는 역할이다.
클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키면 실행 엔진에 의해 실행된다.
실행 엔진은 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경한다.
✅ 런타임 데이터 영역
프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간이다.
애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.
참고 :
https://doozi0316.tistory.com/
https://www.itworld.co.kr/news/110837#csidxb00d888b8a3671abf492e096af5f5ec
https://dongjin94.tistory.com/177
https://velog.io/@soyeon207