-
자바 컴파일 과정Programming Language/Java 2022. 3. 26. 21:17
자바는 'OS에 독립적'이라는 특징이 있다. 풀어서 설명하자면 자바로 작성된 코드는 OS가 무엇인지와 상관없이 실행할 수 있다는 뜻이다. 이것이 가능한 이유는 JVM(Java Virtual Machine)이다. 이제 JVM의 어떤 기능으로 인해 OS에 독립적으로 실행될 수 있는지 자바의 컴파일 과정을 통해 알아보도록 하자.
자바 컴파일 과정
- 개발자의 자바 소스코드 작성(.java파일)
- 자바 컴파일러(Java Compiler)가 javac라는 명령어를 수행한다. javac는 소스코드를 자바 가상 머신(Java Virtual Machine, JVM)이 이해할 수 있는 바이트 코드(.class 파일)로 컴파일하는 명령어다.
이 바이트 코드는 아직 JVM만 읽을 수 있고 컴퓨터는 이해하지 못하는 반기계어 상태이기 때문에 추가적인 변환 과정이 필요하다. 바이트 코드의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있다. - 컴파일된 바이트 코드를 JVM의 클래스 로더(Class Loader)에게 전달한다.
- 클래스 로더는 동적 로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하고 런타임 데이터 영역(Runtime Data Area), 즉 JVM의 메모리에 올린다.
- 클래스 로더 세부 동작
- 로드: 클래스 파일을 가져와 JVM의 메모리에 로드(사용되지 않는 클래스들은 메모리에서 삭제하는 컴파일러 역할도 수행)
- 검증: 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사
- 준비: 클래스가 필요로 하는 메모리 할당(필드, 메서드, 인터페이스 등)
- 분석: 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경
- 클래스 로더 세부 동작
- 실행 엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와 실행하는데, 이때 두 가지 방식을 사용한다.
- 인터프리터 (Interpreter)
바이트 코드를 하나하나 불러와서 해석하고 실행함. '하나하나 불러와서 해석하고 실행'하는 단계에서는 빠르나, 전체적인 실행 속도가 느리다는 단점이 있다. - JIT 컴파일러 (Just-In-Time Compiler)
인터프리터의 단점을 보완하기 위해 나온 방법. 인터프리터 방식으로 실행하다가 일정 시점 이후부터는 바이트 코드 전체를 바이너리 코드로 변환한다. 그 이후에는 따로 불러와서 해석할 필요 없이 바이너리 코드를 바로 실행하는 방식이다. 이때 해석된 코드는 Cache에 보관한다. 불러올 때마다 해석할 필요가 없기 때문에 인터프리터 방식보다 전체적인 실행 속도가 빠르다는 장점이 있다.
- 인터프리터 (Interpreter)
참고
https://gyoogle.dev/blog/computer-language/Java/컴파일%20과정.html
[Java] 컴파일 과정 | 👨🏻💻 Tech Interview
[Java] 컴파일 과정 들어가기전 자바는 OS에 독립적인 특징을 가지고 있다. 그게 가능한 이유는 JVM(Java Vitual Machine) 덕분이다. 그렇다면 JVM(Java Vitual Machine)의 어떠한 기능 때문에, OS에 독립적으로
gyoogle.dev
https://aljjabaegi.tistory.com/387
알기쉽게 정리한 JAVA의 컴파일과정 및 JVM 메모리 구조, JVM GC
알기쉽게 정리한 JAVA의 컴파일과정 및 JVM 메모리 구조, JVM GC 자바 개발자들이 간과 하기 쉬운 JAVA의 메모리 구조에 대해 포스팅 해보려고 합니다. 이와 관련하여 JAVA의 컴파일 과정과 Garbage Collec
aljjabaegi.tistory.com
https://github.com/Songwonseok/CS-Study/blob/main/Language/Java/Java%20컴파일%20과정.md
GitHub - Songwonseok/CS-Study: 면접 대비 CS 스터디(+알고리즘)
면접 대비 CS 스터디(+알고리즘). Contribute to Songwonseok/CS-Study development by creating an account on GitHub.
github.com
https://keepgoing0328.tistory.com/entry/임시
JVM에 대하여
JVM JVM은 자바 소스코드로부터 만들어지는 자바 클래스 파일(.class)을 실행할 수 있다. JVM은 플랫폼에 의존적이다. 예를들어 리눅스의 JVM과 윈도우즈의 JVM은 다르다. 하지만 컴파일된 바이트 코드
keepgoing0328.tistory.com
'Programming Language > Java' 카테고리의 다른 글
자바 가상 머신(Java Virtual Machine, JVM)이란? (0) 2022.03.27 Java의 역사와 특징 (0) 2022.03.26 - 개발자의 자바 소스코드 작성(.java파일)