[JAVA] 컴파일 과정

2024. 2. 26. 09:59Web/JAVA

1. 전체 실행 과정

2. JVM

  • 타겟 플랫폼에 맞춰서 컴파일 해야한다는 단점을 보완하기 위해 나온 플랫폼
  • Java의 바이트 코드는 JVM이라는 가상머신 위에서 돌아감으로써 문제를 해결
  • JVM이 설치된 플랫폼이면 어디든 똑같이 바이트코드가 동작

3. 바이트코드 변환

  • 개발자가 .java 파일을 생성하고 Build를 하게되면 자바 컴파일러의 javac라는 명령어를 사용하여 자바 바이트코드로 구성된 .class파일을 생성하게 됩니다.
  • 바이트코드는 JVM과 같은 가상머신이 이해할수있는 언어이고, 바이너리 코드는 CPU가 이해할 수 있는 언어이다.

4. 클래스 로더와 실행 엔진

  • Bootstrap Class Loader : 가장 기본적인 자바 API를 로드하는 클래스로더
  • Extension Class Loader : 기본 자바 API를 제외한 나머지 확장 클래스 로더
  • System Class Loader : 애플리케이션의 클래스 로드
  • User-Defined Class Loader : 사용자가 직접 생성하여 사용하는 클래스 로더
  • 추출해낸 .class파일은 클래스 로더에 의해서 JVM의 영역으로 들어가게 됩니다.
  • 로딩과정에서 메서드 영역에 클래스를 저장하고, 링크과정에서 구성 요소를 검증하고 메모리를 할당 한 후, 
    초기화 과정에서 클래스 변수들을 적절한 값으로 초기화합니다.
  • 인터프리트 방식 : JVM의 기본적인 방식 -> 바이트코드를 한줄씩 읽는다
  • JIT 컴파일러 방식 : 내부적으로 특정 메서드가 얼마나 자주 수행하는지 체크하고 후에 캐싱하는 방식

5. 런타임 데이터 영역

  • 클래스 로더의 로딩과정을 통해 불러온 클래스들은 메서드영역에 저장
  • 메서드영역에는 클래스와, 인터페이스에 대한 필드 및 메서드정보, Static변수, 메서드의 바이트 코드 등등이 저장
  • 인스턴스나 객체는 힙영역에 저장