공부해봅시당
[쉽게 배우자! JAVA] 컴파일 과정 본문
아래 글을 참고하여 작성함
[Java] 컴파일 과정 | 👨🏻💻 Tech Interview
[Java] 컴파일 과정 들어가기전 자바는 OS에 독립적인 특징을 가지고 있다. 그게 가능한 이유는 JVM(Java Vitual Machine) 덕분이다. 그렇다면 JVM(Java Vitual Machine)의 어떠한 기능 때문에, OS에 독립적으로
gyoogle.dev
자바는 OS에 독립적인 특징을 가지고 있음
그게 가능한 이유는 JVM(Java Vitual Machine) 덕분
JVM(Java Vitual Machine)의 어떠한 기능 때문에, OS에 독립적으로 실행시킬 수 있는지 자바 컴파일 과정을 통해 알아보도록 하자.
자바 컴파일 순서
- 개발자가 자바 소스코드(.java)를 작성
- 자바 컴파일러(Java Compiler)가 자바 소스파일을 컴파일
- 이때 나오는 파일은 자바 바이트 코드(.class)파일(아직 컴퓨터가 읽을 수 없는 자바 가상 머신이 이해할 수 있는 코드 = 반기계어)
- 자바 바이트 코드(.class)의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있음
- 컴파일된 자바 바이트 코드(.class)를 JVM의 클래스로더(Class Loader)에게 전달
- 클래스 로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data area), 즉 JVM의 메모리에 올림
- 클래스 로더 세부 동작
- 로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드
- 검증 : 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사
- 준비 : 클래스가 필요로 하는 메모리를 할당 (필드, 메서드, 인터페이스 등등)
- 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경
- 초기화 : 클래스 변수들을 적절한 값으로 초기화 (static 필드)
- 클래스 로더 세부 동작
- 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행. 이때, 실행 엔진은 두가지 방식으로 변경
- 인터프리터: 자바 바이트 코드를 한줄씩 실행. 속도가 느림.
- 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행
- 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느림 -> 이 단점을 보완하기 위해 나온 것이 JIT Compiler
- JIT 컴파일러(Just-In-Time Compiler): Interpreter의 단점을 보완. 처음 한 번은 전체 바이트 코드 컴파일로 속도 느림. 하지만 캐시 사용으로 한 번 컴파일 하면 다음에는 빠르게 수행됨.
- 인터프리터의 단점을 보완하기 위해 도입된 방식
- 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행
- 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠름
- JIT Compiler에 의해 해석된 코드는 캐시에 보관하기 때문에 한 번 컴파일 된 후에는 빠르게 수행되지만 인터프리팅 방식보다는 훨씬 오래 걸림
- 따라서 한번만 실행하면 되는 코드는 인터프리팅하는 것이 유리함
- 인터프리터: 자바 바이트 코드를 한줄씩 실행. 속도가 느림.
https://aljjabaegi.tistory.com/387
알기쉽게 정리한 JAVA의 컴파일과정 및 JVM 메모리 구조, JVM GC
알기쉽게 정리한 JAVA의 컴파일과정 및 JVM 메모리 구조, JVM GC 자바 개발자들이 간과 하기 쉬운 JAVA의 메모리 구조에 대해 포스팅 해보려고 합니다. 이와 관련하여 JAVA의 컴파일 과정과 Garbage Collect
aljjabaegi.tistory.com
https://steady-snail.tistory.com/67
[JAVA] JVM 동작원리 및 기본개념
JAVA라는 언어를 통해 코딩을 하고 있는 사람으로서 JAVA의 간단한 탄생배경 그리고 JAVA의 시작과 끝이라고 할 수 있는 JVM을 한 번 짚고넘어가려고 해요 우선 JAVA의 탄생배경을 좀 알고가면 이해하
steady-snail.tistory.com
'STUDY > JAVA' 카테고리의 다른 글
[JAVA] Generic을 간단하게 알아보자 (1) | 2024.03.06 |
---|---|
[JAVA] 자바의 Reflection (0) | 2024.03.06 |
[JAVA] Java의 Synchronization이란? (0) | 2024.03.06 |
[JAVA] Garbage Collection(가비지 컬렉션)을 톺아보자 (0) | 2024.03.06 |
[쉽게 배우자! JAVA] String, StringBuffer, StringBuilder의 차이점을 알아보자 (4) | 2021.06.30 |