Programming Language/Java

자바 컴파일 과정

주유소짜글이 2022. 3. 26. 21:17

자바는 'OS에 독립적'이라는 특징이 있다. 풀어서 설명하자면 자바로 작성된 코드는 OS가 무엇인지와 상관없이 실행할 수 있다는 뜻이다. 이것이 가능한 이유는 JVM(Java Virtual Machine)이다. 이제 JVM의 어떤 기능으로 인해 OS에 독립적으로 실행될 수 있는지 자바의 컴파일 과정을 통해 알아보도록 하자.

 

 

 

자바 컴파일 과정


  1. 개발자의 자바 소스코드 작성(.java파일)

  2. 자바 컴파일러(Java Compiler)가 javac라는 명령어를 수행한다. javac는 소스코드를 자바 가상 머신(Java Virtual Machine, JVM)이 이해할 수 있는 바이트 코드(.class 파일)로 컴파일하는 명령어다.
    이 바이트 코드는 아직 JVM만 읽을 수 있고 컴퓨터는 이해하지 못하는 반기계어 상태이기 때문에 추가적인 변환 과정이 필요하다. 바이트 코드의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있다.

  3. 컴파일된 바이트 코드를 JVM의 클래스 로더(Class Loader)에게 전달한다.

  4. 클래스 로더는 동적 로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하고 런타임 데이터 영역(Runtime Data Area), 즉 JVM의 메모리에 올린다.
    • 클래스 로더 세부 동작
      • 로드: 클래스 파일을 가져와 JVM의 메모리에 로드(사용되지 않는 클래스들은 메모리에서 삭제하는 컴파일러 역할도 수행)
      • 검증: 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사
      • 준비: 클래스가 필요로 하는 메모리 할당(필드, 메서드, 인터페이스 등)
      • 분석: 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경

  5. 실행 엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와 실행하는데, 이때 두 가지 방식을 사용한다.
    • 인터프리터 (Interpreter)
      바이트 코드를 하나하나 불러와서 해석하고 실행함. '하나하나 불러와서 해석하고 실행'하는 단계에서는 빠르나, 전체적인 실행 속도가 느리다는 단점이 있다.
    • JIT 컴파일러 (Just-In-Time Compiler)
      인터프리터의 단점을 보완하기 위해 나온 방법. 인터프리터 방식으로 실행하다가 일정 시점 이후부터는 바이트 코드 전체를 바이너리 코드로 변환한다. 그 이후에는 따로 불러와서 해석할 필요 없이 바이너리 코드를 바로 실행하는 방식이다. 이때 해석된 코드는 Cache에 보관한다. 불러올 때마다 해석할 필요가 없기 때문에 인터프리터 방식보다 전체적인 실행 속도가 빠르다는 장점이 있다.

 

 

 

참고


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