1. JVM (자바가상머신)
Java로 작성된 프로그램을 운영 체제에 독립적으로 실행할 수 있게 해 주는 중요한 역할을 한다.
Java파일을 컴파일러를 통해 class파일로 컴파일하여 JVM에서 실행 가능한 상태로 만든다.
JVM은 OS에 따라 해당 OS의 언어로 변환하여 명령어를 던진다.
.png%3Ftable%3Dblock%26id%3D13cfe9bf-8633-8051-8e47-f8119be7f557%26cache%3Dv2&w=1920&q=75)
2. 인터프리터, 컴파일러
1. 인터프리터 (Interpreter)
인터프리터는 소스 코드를 한 줄씩 읽고 바로 실행하는 방식으로 컴파일과 달리 전체 프로그램을 한 번에 번역하지 않고, 코드의 각 줄을 실행하면서 그때그때 번역한다.
- 언어 예시: C, C++, Rust, Go 등
2. 컴파일러 (Compiler)
컴파일러는 소스 코드를 한 번에 기계어(혹은 바이트코드)로 변환한 후, 그 결과물(실행 파일)을 생성합니다. 이 변환 과정은 컴파일이라고 하며, 실행을 시작하기 전에 미리 전부 처리됩니다.
- 언어 예시: Python, Ruby, JavaScript, PHP 등
3. 실행방식
- 소스코드
public class JvmTest {
int num1 = 1;
static int num2 = 2;
void method1(int num3){
System.out.println("num3 : "+num3);
int num4 = 4;
System.out.println("num4 : "+num4);
}
public static void main(String[] args) {
System.out.println("JVM Start");
System.out.println("num2 : "+JvmTest.num2);
JvmTest jt = new JvmTest();
System.out.println("num1 : "+jt.num1);
jt.method1(3);
}
}
1. JVM에서 클래스 로딩 후, static 멤버들이 메모리(메소드 영역)에 할당되고 초기화된다.

2. main 메소드를 실행하며 main Queue를 생성한다.

3. main Queue의 13번 라인이 실행된다.
JVM Start
4. main Queue의 14번 라인이 실행된다.
이때 num2 변수를 호출하고 있는데 이를 메모리에 있는지 확인하고 불러온다.

num2 : 2
5. main Queue의 15번 라인이 실행된다.
15번 라인은 인스턴스를 생성하고 있다.
인스턴스가 생성되면 인스턴스에 대한 heap이 생성되고, heap에는 static하지 않은 변수와 메소드가 저장된다.
- 힙(Heap)은 동적 메모리 할당을 위한 메모리 영역으로, 주로 객체(Object)와 배열(Array) 등의 동적으로 생성된 데이터를 저장하는 데 사용

생성된 heap에 대한 주소를 담은 “jt” 라는 객체는 main 메소드의 스택에 값이 저장된다.

6. main Queue의 16번 라인이 실행된다.
이때 jt의 num1 변수를 호출하고 있는데 jt 주소값을 통해 heap으로 이동후 num1의 값을 가져온다
num1 : 1
7. main Queue의 17번 라인이 실행된다.
jt의 method1 메소드를 호출하면서 정수 3을 전달하고 있다.
method1의 queue와 stack이 생성된다.
method1의 파라미터에 num3 변수를 요구하고 있어 전달받은 3이 저장된다.

8. method1 Queue의 7번 라인이 실행된다.
num3 변수를 호출하고 있어 stack에 있는지 확인하고 불러온다.
num3 : 3
8. method1 Queue의 8번 라인이 실행된다.
stack에 num4 = 4가 저장된다.
9. method1 Queue의 9번 라인이 실행된다.
num4 변수를 호출하고 있어 stack에 있는지 확인하고 불러온다.
num4 : 4
이후에 method1 Queue가 주기를 다하고 queue와 stack이 삭제된다.
10. 자바코드 생명 주기가 끝나 모든 데이터가 삭제된다.
- 총 출력물
JVM Start
num2 : 2
num1 : 1
num3 : 3
num4 : 4
Share article