Yebali

[Java] Java 컴파일과 실행 순서 본문

Backend Common

[Java] Java 컴파일과 실행 순서

예발이 2022. 9. 25. 16:34

자바는 'WORA(Wirte Once, Run Anyway)라는 모토를 가진 언어이다. 즉 한번 작성된 코드는 어떠한 플랫폼에서든 쓸 수 있다.

이런 마법은 JVM(Java Virtual Machine)에 의해 가능하는데, JVM은 OS와 Java 프로그램 사이에 일종의 중계 역할을 하는 가상 머신으로 OS와 독립적인 가상의 환경을 만들어 Java 프로그램이 실행될 수 있게 해 준다. 즉, OS에 JVM만 설치되어 있다면 어디서든 Java 프로그램을 실행할 수 있게 해 준다.

 

Java 컴파일을 검색하면 어느 블로그에나 있는 사진

Java 컴파일 순서

  1. 자바 컴파일러(Java Complier/ javac)가 자바 소스를 컴파일한다. (.java -> .class)
    컴파일 결과로 생성되는 파일(.class)을 바이트 코드라고 하며, 바이트 코드는 컴퓨터가 이해할 수 없고 JVM이 이해할 수 있는 코드이다. 바이트 코드의 명령어는 1Byte 크기의 Opcode와 피연산자로 이루어져 있다.
  2. 컴파일된 바이트 코드를 JVM의 클래스 로더(Class Loader)에게 전달한다.
  3. 클래스 로더(Class Loader)는 동적 로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(RunTime Date Area / JVM의 메모리 영역)에 올린다.
    • 클래스 로더의 세부 동작
      • 로드 : 클래스 파일(.class)을 가져와 JVM의 메모리에 로드한다.
      • 검증 : 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사한다.
      • 준비 : 클래스가 필요로 하는 메모리를 할당한다.
      • 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다.
      • 초기화 : 클래스 변수들을 적절한 값으로 초기화한다.(static 필드)
  4. 실행 엔진(Execution Engine)은 JVM메모리에 올라온 바이트 코드를 명령어 단위로 하나씩 가져와서 실행한다.
    이때 실행 엔진은 두 가지 방식으로 동작한다
    • 인터프리터(interpreter) : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다.
      하나하나의 실행 속도는 빠르나 전체적인 실행 속도가 느리다.
    • JIT 컴파일러(Just In Time Compiler) : 인터프리터의 단점을 보완하기 위한 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고, 이후 인터프리팅 하지 않고 바이너리 코드를 직접 실행하는 방식이다. 전체적인 실행 속도는 인터프리터보다 빠르다.

 

참고.

- https://news.skhynix.co.kr/post/james-gosling-founder-of-java

- https://93jpark.tistory.com/54

 

'Backend Common' 카테고리의 다른 글

Time zone과 표준시  (0) 2022.11.27
[WebSocket] WebSocket이란?  (0) 2022.09.27
[JAVA] Garbage Collection의 개념과 동작  (0) 2022.09.25
[JAVA] JVM의 구조  (0) 2022.09.25
쿠키, 세션 그리고 토큰  (0) 2022.01.21