Java

JVM (1)

move2 2022. 11. 30. 17:07

1.JDK

자바 가상 머신(Java Virture Machine)에 대해서 설명하기전에 JDK에 대해서 알고 가야한다.

JDK는 Java Development Tool + JRE이다.

자바 개발자용 도구들과 JRE를 포함하고 있다.

JRE는 Java Runtime Environment + JVM 이다.

JRE에는 다음과 같이 자바에서 제공되는 기본 라이브러리들이 포함된다.

JVM은 JRE에 속해있다.

2.JVM

2-1. 자바에서 코드의 실행

코드가 실행될때, JVM은 다음의 그림과 같은 역할을 한다.

 2-2. JVM의 구조

출처:http://adnjavainterview.blogspot.com/2017/04/java-vertual-machinejvm-architecture-in.html

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

2-2-1. 클래스 로더와 스태틱 영역

컴파일된 자바의 바이트 코드를 제일 먼저 받아 처리하는 Class Loader Subsystem에 대해서 알아보자.

간단하게 Class Loader Subsystem은 Loading, Linking, Intialization 과정으로 나뉜다.

  • Loading
    • 클래스 로더가 .class 파일을 읽고 데이터를 “Method Area”영역에 저장한다.
      • 메소드 영역에 저장하는 데이터들
        • FQCN(Fully Qualified Class Name) : package를 포함한 Class이름
        • → java.lang.String
        • 클래스 | 인터페이스 | 
        • 메소드와 변수
  • Linking
    • Linking에서는 로드된 클래스나 인터페이스, 그 직계 부모클래스나 인터페이스, 필요한 경우 요소 타입(배열 타입인 경우)을 검증하고, 준비하고, 해석하는 과정을 거친다.
      • Linking 검증, 준비, 해석(Verify, Prepare, Resolve)의 단계로 나누어져 있다.
  • Instalization
    • 각 클래스나 인터페이스의 초기화 로직이 실행된다. 클래스의 위에서 아래로, 클래스 계층 구조에서 부모에서 자식까지 한 줄씩 실행된다.?? Static의 초기화

2-2-2 메모리 영역

  • Method Area 는 클래스 영역 또는 스태틱 영역이라고 한다.
  • Stack 영역은 Thread 영역이라고 한다.
  • 메모리를 이용하는 방식

  • 데이터 저장 영역 세분화

  • → 스태틱 영역 : 클래스와 static 친구들
  • → 힙 영역 : 객체(Instance)들
  • 🔍  그 main(String[] args)
    1. JRE 는 psvm 메서드가 있는지 먼저 찾는다.
    2. psvm 존재 == true → JRE 는 JVM 부팅
    3. 부팅된 JVM은 바이트파일(.class) 실행JVM 전처리 

 java.lang 패키지 로드 : 데이터 저장 영역의 Static 영역에 올린다. 

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

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