728x90
- 자바 소스는 javac 명령을 통해 컴파일된다. (javac VendingMachine.java)
- 컴파일 후 실행할 때, main 메서드를 가진 클래스를 실행한다. (java VendingMachineMain). 즉, JVM 이 VendingMachineMain을 실행해주게 된다.
그렇다면 JVM은 VendingMachineMain을 어디서 찾아서 실행할까?
즉, 정리해서 질문하면, javac를 이용해 compile을 하면, 소스 파일이 있던 곳에 class파일이 생성된다. 그렇다면 java VendingMachineMain이라고 실행하면 JVM은 어디서 찾을까?
JVM이 클래스를 실행하려면, 일단 클래스를 찾아야 한다. 이 때, JVM이 VendingMachineMain 클래스를 java가 실행되는 경로 혹은 현재 폴더에서 찾는다고 하면 틀린 답이다. 정답은 JVM은 CLASSPATH 경로에서 클래스를 찾는다라고 해야 맞는 답이다.
이 때, CLASSPATH에 . 이 있을 경우, 현재 경로에서 클래스를 찾을 수 있게 된다. 다시말하면 Intellij는 소스를 컴파일하고, build/classes/java/프로젝트 폴더 아래에 class 파일을 생성하는데, 이 해당 폴더를 Intellij는 CLASSPATH로 인식하게 해준다.
그 다음 process
- VendingMachineMain 클래스를 JVM이 읽어들이고, 읽어들인 클래스 정보를 PERM이라는 메모리 영역에 저장한다.
- JVM은 해당 클래스가 어떤 static 메서드를 가지고 있는지, 어떤 instance 메서드를 가지고 있는지 모두 알게 된다.
- JVM은 PERM 메모리에 올라가 있는 VendingMachineMain 클래스에서 프로그램 시작점인 main 메서드를 찾게 된다. 그리고 main 메서드를 실행하게 된다.
- Java Stack이라고 불리는 메모리 영역에 실행된 메서드 정보가 올라가게 된다.
- 이때, Java Stack에 저장된 메서드 실행 정보 하나를 Stack Entry라고 한다.
- main 메서드 안에 선언된 변수들은 Stack Entry에 저장된다. 이러한 변수를 로컬 변수라고 한다.
- main 메서드의 argument인 String[] args 도 Stack Entry에 생성된다.
- main 메서드가 실행되면, Heap 메모리에 String 배열 instance가 만들어지고, 이 instance를 args 변수가 참조하게 된다.
- 또한 Stack Entry에는 Program Counter(PC)라고 해서 몇번째 줄을 실행하고 있는지 정보도 기억하고 있다.
- printVersion이라는 static 메서드가 실행되면, Java Stack - Stack Entry 에 메서드가 하나 더 추가된다.
- printVersion 메서드가 실행 후에 종료가 되면, 해당 메서드의 실행 정보를 담고있는 Stack Entry는 Java Stack에서 제거가 된다.
- VendingMachine vm1 = new VendingMachine(); 코드가 실행되면, Heap 메모리에 instance가 생성된다. 그러면 VendingMachine instance를 Stack Entry의 vm1 변수가 참조하게 된다.
- String product = vm1.pushProductButton(100); 메서드가 호출되면서 Java Stack엔 Stack Entry가 생성된다. 그리고 pushProductButton() 메서드에 선언된 지역변수 menuId가 Stack Entry에 생성된다.
정리
메서드 안에 선언된 지역 변수는 메서드가 실행될 때 생성되고, 종료될 때 사라진다. 또한 같은 메서드를 동시에 10번 호출하면 그 메서드 안의 지역 변수는 각기 다른 영역에 저장되어 사용된다. 이 때, 하나의 서버는 여러 개의 요청을 동시에 받아들여 실행할 수 있어야 한다. 자바에선 Thread를 이용해 이런 처리를 할 수 있다.
인용
728x90
'Language > Java' 카테고리의 다른 글
CLASS METHOD vs INSTANCE METHOD (0) | 2023.09.13 |
---|---|
Math클래스 API (0) | 2023.09.13 |
자바 컴파일 과정 (0) | 2023.09.08 |
오버플로우 (overflow) (0) | 2023.09.07 |
각 타입별 값의 범위 (0) | 2023.09.07 |