평소 자바를 사용하면서 자바 프로그램의 내부적인 실행과정을 잘 알지 못했고
보다 정확한 자바 프로그램의 동작 과정을 이해하기 위해 공부하며 정리해 보았다.
자바의 전반적인 실행과정
1) 자바소스(.java)를 자바 컴파일러(javac)를 통해 자바 바이트 코드(.class)로 컴파일한다.
2) .class 파일은 jvm의 클래스 로더(Class Loader)에 의해 로드 후 jvm 메모리 영역(RunTime Data Area)에 적재된다.
3) 실행엔진(Execution Engine)의 interpreter에 의해 운영체제가 이해할 수 있는 기계어로 변환된다.
자바의 실행과정을 크게 3가지 단계로 나눴다. 우리가 코드로 작성한 자바 파일을 실행하게 되면
위와 같은 3단계 과정을 거치면서 동작이 실행되는데 아래의 실행 흐름도를 보면 더 쉽게 이해할 수 있다.
다음으로 위 실행과정에서 중요한 기능들의 역할에 대해 알아보겠다.
JVM
jvm이란 말 그대로 자바 가상 기계다.
일반적으로 컴퓨터를 구동하기 위해서는 하드웨어, 운영체제, 소프트웨어 등 여러 요소들이 필요한데
자바 가상 기계는 자바를 실행시키기 위해 위와 같이 필요한 요소들의 역할을 수행한다.
ClassLoader
ClassLoader는 크게 3가지 역할을 한다. 역할의 기능은 다음과 같다.
- Loading : class 파일을 찾아 jvm에 탑재한다.
- Linking : Loading에 의해 로드된 클래스 파일의 검증 및 준비를 한다.
- Initialization : Linking이 끝나면 클래스 파일을 읽어 들인 후 초기화 작업을 거친다.
(위의 Loding, Linking, Initialization 내에서도 각각 세부적인 과정으로 이루어져 있다)
이러한 ClassLoader의 과정이 끝나면 클래스 파일을 jvm 메모리 영역인 Runtime Data Area에 적재한다.
jvm 메모리 영역에는 메서드, 객체 등에 따라 Method Area, Heap, Java Stack 등 여러 영역으로 나뉜다.
이렇게 적재된 클래스 파일은 메모리 영역을 거쳐 마지막으로 Execution Engine에 제공된다.
클래스 파일은 바이트 코드로 이루어져 있기 때문에 Execution Engine이 이를 해석하여 코드의 내용을 실행시킨다.
jvm의 동작과정 도식화
위와 같이 여러 과정을 거쳐 자바 파일이 실행되는데 자바 코드는 한 번 작성된 후 컴파일이 되어 jvm을 거쳐 실행되기
때문에 운영체제나 플랫폼에 종속되지 않고 어느 컴퓨터에서든 동일하게 실행된다. 이것을 Writer once Run AnyWhere
라 부르다. 하지만 이런 자바 프로그램을 실행시키기 위해서는 jvm 외에도 함께 필요한 것이 있는데 바로 jdk와 jre다.
정리해서 말하자면 jdk(java development kit)를 통해 개발되고 생성된 class 파일은 각각의 운영체제에 따른
jre(java runtime environment) 내 자바 실행기(java.exe) 및 jvm에 전달되어 실행되는 것이다.
Reference
https://velog.io/@minbo2002/%EC%9E%90%EB%B0%94-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EA%B3%BC-%EC%8B%A4%ED%96%89%EA%B3%BC%EC%A0%95
https://coderun.tistory.com/61#2.%20Java%EC%9D%98%20%EC%8B%A4%ED%96%89%20%EC%9B%90%EB%A6%AC%C2%A0
https://tutorial.eyehunts.com/java/how-java-program-run-java-work-compiler/
https://steady-snail.tistory.com/67
https://tecoble.techcourse.co.kr/post/2021-07-15-jvm-classloader/
'study > java' 카테고리의 다른 글
JAVA STOMP 개념 및 활용 (0) | 2024.06.09 |
---|---|
JAVA 21 Virtual Threads (0) | 2024.06.08 |
java 객체 배열이란? (객체 배열의 정의와 코드 구현 예제) (0) | 2023.01.09 |
java 접근 제어자 private, getter, setter.. (0) | 2022.10.13 |
[java/Eclipse] "Editor does not contain a main type" 에러 해결 (0) | 2022.08.03 |
댓글