Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

4 Weeks - [Java 컴파일 과정] #72

Open
Seongeuniii opened this issue Sep 3, 2023 · 1 comment
Open

4 Weeks - [Java 컴파일 과정] #72

Seongeuniii opened this issue Sep 3, 2023 · 1 comment
Assignees

Comments

@Seongeuniii
Copy link
Collaborator

문제

Java로 작성된 코드가 JVM에서 어떤 과정을 거쳐 애플리케이션으로 동작하게 되는지 정리해보면 좋을 것 같습니다.

contents - 세부 내용

  • 프로젝트의 모듈화
  • 프로젝트의 컴파일과 빌드
  • requires, exports 구문
  • 등...
  • Ch.14에서 이러한 것들을 설명하고 있는데 JVM에서는 어떤 과정을 거치는지 궁금합니다.

참고

@Hot-ttu
Copy link
Member

Hot-ttu commented Sep 8, 2023

Java 컴파일 과정

JVM?

📖 Java Virtual Machine : 자바 프로그램 실행환경을 만들어 주는 소프트웨어
  • java는 JVM을 사용하면 하나의 바이트 코드(.class)로 모든 플랫폼에서 동작하도록 할 수 있어 플랫폼에 영향을 받지 않습니다.
    • Write once, run anywhere

R1280x0

  • java는 플랫폼에 종속적이지 않지만 JVM은 플랫폼에 종속적입니다.

컴파일

  • java 코드를 JVM에서 바로 실행할 수 있는 것이 아니여서 컴파일 과정을 거쳐야 합니다.
  • java 소스 코드는 java 컴파일러를 사용하여 바이트 코드로 변환됩니다. 바이트코드는 .class 확장자를 갖습니다.

클래스 로더

💡 클래스 로더 : 런타임 중에 JVM의 메소드 영역에 동적으로 java 클래스를 로드하는 역할
  • 컴파일된 바이트 코드를 JVM의 클래스로더에게 전달합니다.
  • 클래스 로더는 동적로딩을 통해 필요한 클래스들을 로딩 및 링크하여 JVM의 메모리에 올립니다.

클래스로더 단계

  • 클래스로더는 로딩, 링크, 초기화 단계로 나뉘어져 있습니다.

  • 로딩

    • 자바 바이트코드(.class)를 메소드 영역에 저장합니다.
    • 각 자바 바이트코드(.class)는 JVM에 의해 메소드 영역에 다음 정보들을 저장한다.
      • 로드된 클래스를 비롯한 그의 부모 클래스의 정보
      • 클래스 파일과 Class, Interface, Enum의 관련 여부
      • 변수나 메소드 등의 정보
  • 링크

    • 검증 : 읽어 들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 잘 구성되어 있는지 검사합니다.
    • 준비 : 클래스가 필요로 하는 메모리를 할당하고 클래스에서 정의된 필드, 메소드, 인터페이스를 나타내는 데이터 구조를 준비합니다.
    • 분석 : 심볼릭 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체합니다.
    💡 심볼릭 레퍼런스 : 참조하는 클래스의 특정 메모리 주소를 참조 관계로 구성한 것이 아니라, 참조하는 대상의 이름만을 지칭하는 것입니다.
  • 초기화

    • 클래스 변수들을 적절한 값, 즉 static 필드들을 설정된 값으로 초기화합니다.

실행 엔진

  • 실행 엔진은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행합니다. 이때, 실행 방식은 2가지 방식으로 변경합니다.
  1. 인터프리터
    • 바이트 코드 명령어를 한 줄씩 읽어서 기계어로 해석하는 방식입니다.
    • 전체적인 실행속도가 느리다는 단점이 있습니다.
  2. JIT 컴파일러 (Just-In-Time Compiler)
    • 인터프리터의 단점을 보완하기 위해 도입된 방식입니다.
    • 같은 코드를 매번 해석하지 않고, 실행할 때 컴파일을 하면서 해당 코드를 캐싱합니다. 이후에는 바뀐 부분만 컴파일하고, 나머지는 캐싱된 코드를 사용합니다.

R1280x0-2

참고:

https://steady-coding.tistory.com/593

https://coding-factory.tistory.com/827

https://gyoogle.dev/blog/computer-language/Java/컴파일 과정.html#자바-컴파일-순서

https://velog.io/@dion/백기선님-온라인-스터디-1주차-JVM은-무엇이며-자바-코드는-어떻게-실행하는-것인가#학습할-것

https://happy-coding-day.tistory.com/entry/JVM-이해하기-1

클래스로더:

https://steady-coding.tistory.com/593

@devjy39 devjy39 closed this as completed Sep 10, 2023
@devjy39 devjy39 reopened this Dec 26, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants