자바의 컴파일 과정
자바는 JVM을 통해 OS에 독립적으로 실행시킬 수 있는데
어떻게 이런 일이 가능한지 알기 위해 자바의 컴파일 과정을 살펴보겠습니다.
public class Main {
public static void main(String[] args) {
System.out.println("Hello");
}
}
우리는 보통 위와 같이 ".java" 확장자를 가진 파일에 소스 코드를 작성하고
인텔리제이나 이클립스 같은 IDE로 손쉽게 버튼을 클릭해 실행하거나
"javac"와 "java" 명령어를 통해서 실행할 수 있습니다.
컴파일 타임 환경
이 과정에서 소스 코드를 실행하기 위해 컴파일 하는 과정을 거치게 되는데
위 이미지와 같이 ".java" 파일이 컴파일러를 거쳐 ".class"파일이 생성되게 된다.
여기서 생성된 자바 바이트 코드는 아직은 컴퓨터가 읽을 수 없는 코드로
JVM만 이해할 수 있는 코드입니다.
(프로젝트의 최상위에 존재하는 out 폴더에서 class 파일을 확인할 수 있다)
런타임 환경
바이트 코드는 JVM만 이해할 수 있는 언어이므로 이를 JVM의 클래스 로더에 전달하고
클래스 로더가 동적 로딩을 통해 필요한 클래스들만 로딩 및 링크하여
JVM의 메모리(런타임 데이터 영역)에 올립니다.
이 과정에서 클래스 로더의 세부 동작은 아래와 같습니다.
- 로드 : 클래스 파일을 가져와 JVM의 메모리에 로드
- 검증 : 자바 언어와 JVM의 명세에 명시된 대로 구성된지 검증
- 준비 : 클래스가 필요로 하는 메모리를 할당 (필드, 메서드, 인터페이스 등)
- 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경
- 초기화 : 클래스 변수들을 적절한 값으로 초기화 (정적 필드)
이 후에 실행 엔진이 JVM 메모리에 올라온 바이트 코드들을
인터프리터 혹은 JIT 컴파일러 방식으로 명령어를 가져와서 실행합니다.
인터프리터는 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행하여
각각의 실행은 빠르나 전체적인 실행 속도가 느리다는 단점이 있습니다.
JIT 컴파일러 방식은 바이트 코드 전체를 컴파일 하여 바이너리 코드로 변경한 후에
항상 바이너리 코드로 직접 실행하는 방식으로
매번 하나씩 인터프리팅 하지 않아 전체적인 실행 속도가 빠릅니다.
Reference
https://steady-snail.tistory.com/67
[JAVA] JVM 동작원리 및 기본개념
JAVA라는 언어를 통해 코딩을 하고 있는 사람으로서 JAVA의 간단한 탄생배경 그리고 JAVA의 시작과 끝이라고 할 수 있는 JVM을 한 번 짚고넘어가려고 해요 우선 JAVA의 탄생배경을 좀 알고가면 이해하
steady-snail.tistory.com
https://aljjabaegi.tistory.com/387
알기쉽게 정리한 JAVA의 컴파일과정 및 JVM 메모리 구조, JVM GC
알기쉽게 정리한 JAVA의 컴파일과정 및 JVM 메모리 구조, JVM GC 자바 개발자들이 간과 하기 쉬운 JAVA의 메모리 구조에 대해 포스팅 해보려고 합니다. 이와 관련하여 JAVA의 컴파일 과정과 Garbage Collect
aljjabaegi.tistory.com
'Java > Notion' 카테고리의 다른 글
Garbage Collection 파헤치기 (0) | 2024.03.03 |
---|---|
JVM 뜯어보기 (컴파일, 인터프리팅, JIT, GC, 메모리) (0) | 2024.03.02 |
BigInteger (0) | 2023.05.08 |
Optional<T> (0) | 2023.05.03 |
Stream (1) | 2023.05.03 |