[CS] Java 컴파일 과정

박상민·2023년 3월 1일
0

Computer Science

목록 보기
4/29

📌Java 언어의 특징

  • 운영체제에 독립적이다.

    • 일종의 에물레이터인 자바가상머신(JVM)을 통해서 운영체제, 하드웨어와 통신이 가능하다.
    • 자바 응용프로그램은 JVM와 통신을 하고 JVM은 운영체제, 하드웨어가 이해할 수 있도록 변환하여 전달한다.
  • 객체 지향 언어이다.

    • 객체 지향 개념의 특징인, 상속, 캡슐화, 다형성 모두 적용된 순수한 객체 지향 언어이다.
  • 자동 메모리 관리 (GC)

    • 자바 응용 프로그램이 실행되면 가비지컬렉터(garbage collector)가 자동적으로 메모리를 관리해주기 때문에 프로그래머는 메모리를 따로 관리하지 않아도 된다.
  • 네트워크와 분산처리를 지원한다.

    • 다양한 네트워크 프로그래밍 라이브러리를 통해 비교적 짧은 시간에 네트워크 관련 프로그램을 쉽게 개발할 수 있도록 지원한다.
  • 멀티쓰레드를 지원한다.

    • 일반적인 멀티쓰레드 지원은 사용되는 운영체제에 따라 구현방법도 상이하며, 처리 방식도 다르다. 하지만 자바에서의 멀티쓰레드 지원은 시스템과는 관계없이 구현가능하며, 관련된 라이브러리가 제공되기 떄문에 구현이 쉽다.
    • 여러 쓰레드에 대한 스케줄링은 자바 인터프리터가 담당한다.

📌 Java 컴파일 순서

💡 자바 실행 과정

  • 자바는 자바 코드(.java)를 자바 가상 머신(JVM)이 실행시킬 수 있는 자바 바이트 코드(.class)로 변환한다.
  • 이후 자바 바이트 코드는 JVM의 자바 인터프리터를 이용해 운영체제, 하드웨어가 이해할 수 있는 2진 코드로 변환한 후 실행시킨다.
  1. 개발자가 자바 코드(.java)를 작성한다.

  2. 자바 컴파일러가 자바 코드를 JVM이 이해할 수 있는 바이트코드로 컴파일한다.

  3. 바이트 코드를 JVM의 클래스 로더에게 전달한다.

  4. 클래스 로더는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역인 JVM 메모리에 올린다.

    💡 JVM 동적 클래스 로딩

    • 클래스 로더는 '.class" 바이트 코드를 읽어 class 객체를 생성하는 역할을 담당한다.
    • 클래스 로딩은 세부적으로 로딩, 링크 초기화라는 3단계의 과정을 거친다.
    • 로딩 : 클래스 파일을 바이트 코드로 읽어 메모리로 가져오는 과정
    • 링크 : 읽어온 바이트 코드의 자바 규칙 검증과 클래스에 정의된 필드, 메소드, 인터페이스들을 나타내는 데이터 구조를 준비하며, 그 클래스가 참조하는 다른 클래스를 로딩하는 과정
    • 초기화 : 슈퍼 클래스 및 정적 필드를 초기화하는 과정
  5. 실행 엔진은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행한다.
    Java 실행엔진 (인터프리터, JIT 컴파일러, GC)

    💡 Java 인터프리터

    • 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다.
    • 명령어 각각의 실행은 빠르나, 전체적인 실행 속도가 느리다.

    💡 JIT 컴파일러

    • Just-In-Time 컴파일러
    • 바이트코드를 CPU로 직접 보낼 수 있는 바이너리 코드로 바꾸는 역할
    • 성능 최적화를 위해 애플리케이션 런타임을 향상시킬 수 있다.
    • 다른 컴파일러 유형과는 달리, 프로그램이 시작되고 코드를 컴파일한다.
    • 기계어로 변환된 코드를 캐시에 저장해서 재사용시 컴파일을 다시 하지 않아도 되기 때문에 동적 컴파일을 하는 다른 언어보다 훨씬 좋은 성능을 낸다.
profile
💡 클린코드를 지향하는 Backend Developer

0개의 댓글