1. Java 프로그램 실행 과정
- 컴파일 단계: 사람이 작성한
.java
파일을 컴파일러가 컴파일하여.class
파일로 변환,.class
파일은 HDD에 저장되며, JVM이 이해할 수 있는 바이트코드이다.
- 메모리 로드: 실행하려면 메모리에 로드되어야 하므로, HDD에 저장된
.class
파일을 RAM으로 로드한다.
- JVM 해석 및 실행: JVM이
.class
파일을 해석(interpret)하고 실행합니다. 실행된 결과는 OS로 전달
- OS로 전달 및 실행: OS는 쉘(Shell)을 통해 하드웨어(HW)에서 명령을 실행하고 결과를 반환. ( os는 명령내리기 용이함.)
2. JVM 자바가상머신
JDK(Java Development Kit)설치시 JRE와 compiler가 설치
- JRE - Java 애플리케이션이 실행될 수 있도록 라이브러리와 JVM을 포함한 실행환경을 제공.
- JRE는 Java 프로그램 실행에 필요한 환경을 제공하여 JRE만으로도 프로그램을 실행할 수 있으므로 일반사용자는 compiler가 필요하지 않음.
JVM의 메모리 구조
JVM은 프로그램 실행 시 메모리를 4가지 영역으로 나누어 관리
- Static : 클래스와 관련된 정보와 정적(static) 변수를 저장.
- Heap : 새로운 키워드로 생성된 객체가 저장되는 영역으로, 프로그램이 실행되는 동안 지속.
- Stack : 메서드 내에서 선언된 지역 변수가 저장되는 영역으로 메서드 호출이 끝나면 메모리에서 사라짐.
- Queue : JVM에서 실행할 명령의 대기열로 이용.
3. JVM 이해코드
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);
}
}
- JVM이 실행되며 class를 로드한다.
- static를 찾아 static메모리에 할당한다. 이 때 num2,main가 static에 할당된다.
- main queue가 생성된다
- JVM Start 출력
- 처음에 static에 할당된 num2 출력
- main의 stack에 jt의 주소가 할당, jt heap메모리에 num1,method1가 저
- main stack에 저장된 jt의 주소를 거쳐 jt heap에 저장된 num1의 값을 불러와 출력한다.
- jt heap에 저장된 method1의 stack메모리에 지역변수인 num3와 num4가 저장되고 method1이 호출된다.
main queue가 순차적으로 진행된다.
System.out.println("JVM Start");
System.out.println("num2 : "+JvmTest.num2);
JvmTest jt = new JvmTest();
System.out.println("num1 : "+jt.num1);
jt.method1(3);
Share article