CS Study 1주차: [Java] 컴파일 과정

hjern·2024년 2월 16일
0

CS Study

목록 보기
1/10
post-thumbnail

컴파일 과정의 큰틀

  1. 자바라는 컴퓨터 언어에 맞도록 작성된 인간어(.java file)를 컴파일러를 통해 자바 가상 머신이 이해할 수 있는 반기계어인 자바 바이트 코드(.class file)로 전환하는 과정인 컴파일을 진행
  2. Run
  3. 확장자가 .class인 파일을 읽은 Java Virtual Machine이 컴퓨터를 동작시킴

JVM 속 동작 환경

1. 3 main components of JVM Architecture
.class file(바이트 코드)은 JVM 내 클래스 로더에게 전달되어 실행엔진에 의해 기계어로 해석되며 Runtime Data Area에 배치됨

1) Class Loader subsystem

(1) load
메모리에 바이트 코드를 할당하는 일을 담당

(2) link

- Verify(검증): 기본적으로 클래스 로더에 의해 로딩된 바이트 코드가 JVM Class Specification과 그 상세에 알맞게 구성됐는지 체크하는 단계
- Prepare(준비): 클래스가 필요로 하는, 클래스 변수에 한해서(not for the instance variables) 메모리를 할당되는 과정
- Resolve(분석): 클래스 내의 모든 심볼릭 레퍼런스(기호 참조)가 해결되는 과정으로써 다이렉트 레퍼런스(실제 참조)로 변경되는 과정

(3) initialize
클래스 변수들을 적절한 값으로 초기화

2) 5 areas or Runtime data areas

(1) Methord Area
클래스와 메소드, 멤버(클래스, 인스턴스)변수와 상수(final) 정보 등이 저장되는 공간

(2) Heap
New명령어를 통해 생성한 인스턴스와 배열 등의 참조형 변수정보가 저장되는 공간.물론 Method Area에 올라온 클래스들만 생성이 가능. GC의 대상

(3) Stacks
클래스 내의 메소드에서 사용되는 정보들이 저장되는 공간으로 매개변수, 지역변수, 리턴값 등이 저장되며 LIFO(Last In First Out) 방식으로 메소드 실행 시 저장되었다가 실행이 완료되면 제거. 임시 저장공간

(4) PC Registers
쓰레드마다 하나씩 생성. JVM 명령의 주소값이 저장되는 공간

(5) Native Method Stacks
자바 외 다른 언어의 호출을 위해 할당되는 영역. 자바에서 C/C++의 메소드를 호출할 때 사용하는 Stack 영역

3) Execution Engine
JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행

(1) 인터프리터 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행. 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다는 단점

(2) JIT 컴파일러(Just-In-Time Compiler) : 인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠름

예상 질문

  1. the role of the class loader subsystem in JVM?
    ✅ 클래스 로더 시스템의 근본적인 역할은 로드에 있으며 바이트 코드(클래스 파일)를 메모리에 올리고, 클래스를 링크link하고, 실행 준비를 한다.

  2. the three phases of class linking in JVM.
    ✅ 바이트 코드를 링크하는 작업은 검증, 준비, 분석으로 구분된다. 검증은 로드된 바이트 코드를 JVM의 사양에 준수하는지를 확인하며 준비는 클래스 변수에 한한 메모리 할당을 하고, 분석 과정을 통해 기호 참조를 직접 참조로 변환한다.

  3. Why is class initialization important in JVM?
    ✅ 클래스 변수를 적절한 value로 초기화함으로써 클래스 변수가 사용되기 전에 적절한 셋업을 하기 위한 작업이기 때문이다. 또한 실행 중 예기치 못한 실행을 예방할 수 있다.

  4. the purpose of each of the five runtime data areas in JVM.
    ✅ 메소드 영역은 클래스의 구조와 메소드 정보, 상수 풀을 저장한다. 힙heap은 객체와 배열을 저장하며, 가비지 컬렉션의 대상이다. 스택은 매개 변수, 지역 변수, 반환 value를 저장한다. PC 레지스터는 각 스레드에 대해 현재 실행 중인 JVM 명령어의 주소를 저장한다. 네이티브 메서드 스택은 JAVA에서 C언어 등의 타 언어를 호출하는 처리를 한다.

  5. How does garbage collection work in the JVM Heap?
    ✅ 힙heap 영역의 가비지 컬렉션은 어플리케이션에 더 이상 참조되지 않는 객체를 제거함으로써 작동한다. 이는 메모리를 회수함과 동시에 누수를 방지한다.

  6. Compare and contrast the interpreter and JIT compiler.
    ✅ 인터프리터는 바이트 코드를 하나씩 읽어서 실행하기 때문에 전반적으로 느릴 수 있다. 반면에 JIT 컴파일러는 바이트 코드를 바이너리 코드로 컴파일하여 직접 실행하기 때문에 전반적인 성능 향상을 도모할 수 있다.

  7. the benefits of using JIT compilation over interpretation.
    ✅ JIT 컴파일러를 사용할 때 얻을 수 있는 장점은 인터프리테이션을 줄이고, 자바 어플리케이션의 실행을 빠르게 함으로써 바이트 코드를 기계어로 컴파일 하는 과정에서의 성능 향상시킬 수 있다는 점이다.

  8. the role of the bytecode verifier in JVM.
    ✅ 검증 과정은 바이트 코드가 JVM specification에 의해 정의된 규칙과 제약에 적합한지를 확인함으로써 잠재적으로 존재할 수 있는 불분명하거나 모호한 코드들이 실행되는 것을 막는데 의의가 있다.

  9. Explain the process of JIT compilation in more detail.
    ✅ JIT 컴파일 과정은 바이트 코드를 기계어로 해석하는 과정임과 동시에 이때 컴파일된 코드는 메모리에 저장되며 다음 실행 시 재사용될 수 있으므로, 인터프리터 보다 성능 향상을 도모할 수 있다.

참고자료
[Java] 컴파일 과정
[JAVA] JVM 동작원리 및 기본개념
JVM(Java Virtual Machine) 아키텍처 - 튜토리얼
알기쉽게 정리한 JAVA의 컴파일과정 및 JVM 메모리 구조, JVM GC

profile
주니어의 굴레는 언제 벗어날 것인가

0개의 댓글