Java - JVM 구조, 메모리와 코드의 흐름

mil nil·2022년 12월 1일
0
post-thumbnail

자바 심화 1일차 강의

Java - JVM 구조, 메모리와 코드의 흐름

  • Java 코드가 실행되는 과정을 설명할 수 있다.
  • JVM 구조를 정리할 수 있다.
  • 코드와 메모리를 연관 지어 설명할 수 있다.

JVM(Java Virtual Machine) 이해하기

  1. 코드가 실행되는 과정
    코드가 실행되는 과정
  • 우선 개발자가 코드를 작성(.java) -> 자바 컴파일러 -> 바이트 코드(.class) -> JVM 통과 -> Hardware에서 작동
  1. JDK
  • JDK : Java Development ToolKits + JRE -> 개발과 작동을 모두 포함
  • JRE : Java Runtime Environment + JVM -> 작동만을 위한 환경!
    JRE
  • 오라클의 경우 자바 11부터 JDK만 제공

컴파일은 누가? text editor가!

메모리와 실행 엔진

1. JVM이 사용하는 메모리 영역

a. JDK 구조

JDK 구조
b. JVM 구조
JDK 구조

  • 클래스 로더 서브시스템 Class Loader Subsystem
    • .class 에서 바이트코드를 읽고 메모리에 저장.
  • 메모리
    • 메소드 영역 Method Area
    • 힙 Heap 영역에는 객체를 저장.
    • 스택 Stack 영역에는 스레드마다 런타임 스택을 만들고, 스택 프레임이라 부르는 블록을 쌓는다.
  • 실행엔진
    • JIT 컴파일러가 반복되는 코드를 재사용해서 속도를 높인다.
    • GC : 더이상 참조되지 않는 객체를 모아서 정리한다.
  • JNI(Java Native Interface)
    • C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법 제공.
    • 자바에서 기본으로 제공되는 메서드에 native 키워드가 붙은 친구.
  • 네이티브 메소드 라이브러리.
    • C, C++로 작성된 라이브러리.

2. 클래스 로더와 static 영역

클래스 로더 서브시스템 Class Loader Subsystem

Loading

  • 클래스 로더가 .class 파일을 읽고 데이터를 “Method Area”영역에 저장
    - 메소드 영역에 저장하는 데이터들
    - FQCN(Fully Qualified Class Name) : package를 포함한 Class이름
    → java.lang.String
    - 클래스 | 인터페이스 | 이늄
    - 메소드와 변수
    Linking
  • Linking은 Verification, Preparation, Resolution 이렇게 3 단계로 이루어 진다.
    • Verification
      • Java Language 규칙을 준수하는지 확인 한다.
        • Java Class 파일은 네트워크를 통해 로드 되거나 로컬 파일 시스템에 의해 로드 될 수 있다. 이런 두 경우 모두 JVM은 신뢰성이 낮은 자원으로 부터 받아진 클래스들은 신뢰 하지 않는다.
        • Verification은 이미 컴파일 단계에서도 수행이 된다. 하지만 JVM은 다시한번 Verification 단계를 거친다.
    • Preparation
      • Static Fields에 대한 메모리를 할 당한다.
      • static fields가 모두 초기화 된 후 instance fields가 초기화 된다.
    • Resolution
      • 해당 클래스의 참조된 클래스들을 로드 한다.
      • Resolution은 Linking의 Prepation단계에서 수행 될 수 도 있고 Initialization 단계 이후 수행 될 수도 있다.
        • 해당 클래스가 여러개의 Instance를 생성해도 Symbolic Reference Resolution은 오직 한번 만 일어 난다.

심볼릭 레퍼런스 Symbolic Reference란?
참조하는 클래스의 주소가 아닌 이름만을 지칭한 것이다. Class 파일이 JVM에 올라가게 되면 그 이름에 맞는 객체의 주소를 찾아서 연결하는 작업을 수행한다. 이러한 과정을 Dynamic Linking이라고 한다. -> class 파일을 compact하게 유지할 수 있다.

Linking 관련 출처 : https://mia-dahae.tistory.com/98

Initialization

  • “Static“ 붙은 친구들을 초기화.
  • static 블럭 실행

관련 내용 정리: Java - static(정적) 변수와 메소드

3. 메모리 영역

  • 데이터 저장 영역 위주로 확인

데이터 저장 영역 세분화

  • Method Area 는 클래스 영역 또는 스태틱 영역이라고 한다.
  • Stack 영역은 Thread 영역이라고 한다.

→ 스태틱 영역 : 클래스와 static들

→ 스택 영역 : 메서드들

→ 힙 영역 : 객체(Instance)들

  1. JRE 는 psvm 메서드가 있는지 먼저 찾는다.
  2. psvm 존재 == true → JRE 는 JVM 부팅
  3. 부팅된 JVM은 바이트파일(.class) 실행
    개발자가 작성한 클래스와 import package를 데이터 저장 영역의 Static 영역에 올린다.


4. 개발자가 작성한 클래스와 import package를 데이터 저장 영역의 Static 영역에 올린다.

5. 데이터 저장 영역의 Stack 영역에 main() 스택 프레임이 올라간다.

추가 공부할 것

  1. 실행 엔진과 GC
    1. 실행 엔진
    • 더 자세히 공부하기 참고
      1. 인터프리터
        • 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경
        • 참고 자료 👉 인터프리터
      2. JIT(Just In Time) 컴파일러
        • 코드를 바로 실행시키는 인터프리터와 정적 컴파일의 혼합 방식
        • JIT(Just-In-TIme Compiler) 또는 동적 번역(dynamic translation)은 실행 과정에서 실시간으로 캐싱하여 같은 함수가 여러 번 불릴 때마다 매번 기계어 코드를 생성하는 것을 방지한다.
        • 참고 자료 👉 JIT
        • 참고 자료 👉 JIT
    1. Garbage Collector
      1. 참조되지 않은 객체를 수집하고 제거한다.
profile
자바 배우는 사람

0개의 댓글