IDE는 자바 프로그램의 실행 명령어들을 대신 입력을 해주어 명령어를 몰라도 코드를 실행 할 수 있게 해준다. 이러한 추상화 덕분에 편리하지만 이러한 지식 없이 자바를 공부한다면 공부의 효율성이 떨어질 수 있다는 단점이 있다.
JVM(Java Virtual Machine) 동작 원리
JVM은 "java ClassName" 명령어를 통해 실행을 시킬 수 있게 된다. ClassName은 반드시 main 메서드가 들어있는 주 클래스여야 한다. JVM이 실행이 된 후 JVM의 부트스트랩 클래스 로더가 필요한 클래스 파일인 java.lang 패키지의 클래스 파일들을 먼저 로드 해준다. 이후, 애플리케이션 클래스 로더가 main 메서드 주 클래스를 로드를 해주게 된다. 이러한 과정이 다 끝나면, JVM은 main 메서드를 호출하여 실행을 시작하게 된다.
JVM 동작 순서
1. JVM 실행
2. JVM 운영체제로 부터 메모리 할당 ( Heap , Stack , Method Area )
3. (로드 과정) JVM 안의 클래스 로더 MyProject 메모리에 로드
-> 애플리케이션 클래스 로더가 main 주 클래스 MyProject를 메모리에 로드함.
4. JVM의 부트스트랩 클래스 로더를 통해 필요한 클래스 파일들 메모리에 로드
-> java.lang.Object , java.lang.String, java.lang.System 등 lang패키지 -> 필수적 로드 기본 클래스
-> 주 클래스에서 사용되는 static 초기화 블록 및 static 필드
5. main 메서드 실행
-> main 메서드가 실행 되고, JVM은 해당 바이트코드를 읽고 해석하여 기계어로 변환하게 된다.이 변환 과정은 JIT 컴파일러가 사용이 된다.
-> 변환 된 기계어는 운영체제를 통해 CPU에게 전달이 되고, CPU가 이 명령어를 실행하도록 지시를 하게 된다.
-> CPU는 운영체제 지시를 받고 기계어 명령어를 실행하고, 프로그램의 로직에 따라 작업을 수행한다.
6. 연관된 객체 생성 시 import 패키지 주소값 참조해서 JVM 클래스 로더 해당 클래스 메모리에 로드
-> 해당 클래스 로더는 애플리케이션 클래스 로더 이다.
-> ( 한 번 로드된 클래스는 JVM의 Method Area에 저장이 된다. 재사용성 증가 )
-> 이 후 객체 생성 시 Method Area에서 가져와 Heap 메모리 영역에 객체 생성
7. 소스 코드 전부 실행 후 main 메서드 종료 및 JVM 메모리 운영체제에 반납
Heap / Stack / Method Area 영역에 관한 내용은 다음을 기약하며...
JIT 컴파일러에 관한 내용은 다음을 기약하며...
JVM과 운영체제 및 CPU 상호 작용은 다음을 기약하며...
만약 JVM에 대해서 모든걸 알고싶다면 아래의 공식 문서를 참고...
https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
'Java' 카테고리의 다른 글
[Java] 변수 초기화에 대한 이해 (0) | 2024.11.05 |
---|---|
[Java] Annotation 이란? ( 애노테이션 ) (0) | 2024.11.05 |
[Java] 클래스와 객체의 정의 (9) | 2024.10.05 |
[Java] 상속 ( Extends ) (1) | 2024.05.01 |
[Java] 예외 ( Exception ) (2) | 2024.04.26 |