JVM, JRE, JDK 그리고 자바

최기곤·2021년 1월 13일
0

자바

목록 보기
1/3
post-thumbnail

JVM이란?

Java Virtual Machine, 자바가상머신으로 자바 바이트코드를 OS에 특화된 코드로 변환(인터프리터와 JIT컴파일러)하여 실행한다. 때문에 플랫폼(OS)에 종속적이다.

JRE이란?

Java Runtime Environment, 자바실행환경으로 자바어플리케이션을 실행할 수 있도록 구성
JVM과 핵심 libarary 및 Property, Resource를 가지고 있다. (JVM + 라이브러리)

JDK이란?

JAVA Development Environment, 자바개발환경으로 JRE에 개발에 필요한 툴이 추가된 배포판이다. 자바11부터 JRE가아닌 JDK만 제공한다.

JAVA란?

프로그래밍언어로 JDK에 포함된 javac(자바컴파일러)로 컴파일하여 바이트코드로 변환된다. 자바는 바이트코드로 변환되는 대상이기 때문에 플랫폼에 독립적이다.

자바 프로그램 실행과정

  1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그래밍 필요로 하는 메모리를 할당받는다.
    JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 컴파일하여 자바 바이트코드(.class)로 변환시킨다.
  3. Class Loader를 통해 .class파일들을 JVM으로 로딩한다.
  4. 로딩된 .class파일들은 Execution Engine을 통해 해석된다.
  5. 해석된 바이트코드는 Runtime Data Area에 할당되어 실질적인 수행이 이루어지게 된다. 이러한 실행과정속에서 JVM은 필요에 따라 Thread Synchronization과 GC같은 관리작업을 수행한다.

클래스로더

자바바이트코드를 RuntiomDataArea로 적재하는 역할을 한다

  • Loading : .class 파일을 읽어 바이트 코드를 바이너리 데이터로 변경하여준 후, 메소드 영역(Method Area)에 저장한다.
  • Linking : 링킹은 3단계로 진행된다.
    Verify (검증) -> Prepare (준비) -> Resolve (Optional 혹은 해석)
    Verify : 바이트코드가 유효한지 검사한다.
    Prepare : static 변수와 기본값에 필요한 메모리를 준비
    Resolve : 심볼릭 메모리 레퍼런스를 실제 메모리 레퍼런스로 교체한다. 단, Optional이다.
  • Initialization : 메모리 영역에 static값을 할당한다.
  1. Bootstrap Class Loader :
    JVM이 실행될 때 가장 먼저 실행되는 ClassLoader이며, ($JAVA_HOME/jre/lib/rt.jar) 경로에 있는 Java 실행에 필요한 기본적인 Class 들을 로딩한다.
    특이한 점이라면 Java로 구현된 다른 ClassLoader와는 다르게 네이티브 코드로 구현되어 있다.

  2. Extension Class Loader :
    $JAVA_HOME/lib/ext/*.jar) 경로에 있는 Java 확장 클래스들을 로딩한다. 다만 시스템(System) ClassLoader와는 다르게 Classpath에 설정되어 있지 않아도 되며, 다양한 보안 확장 기능 등을 여기에서 로딩한다.

  3. System Class Loader :
    Classpath 혹은 JVM 옵션 중 -cp, -classpath에 지정된 Class들이 로딩되며, 애플리케이션의 Class들을 로드한다고 할 수 있다. 즉, 사용자가 지정한 $CLASSPATH 내의 Class들을 로딩한다.

  4. 사용자정의 Class Loader :
    애플리케이션 사용자가 직접 코드상에서 생성하여 사용하는 클래스 로더이다. 3가지의 웹 로직(WebLogic) ClassLoader도 사용자 ClassLoader에 포함되며, 부모 ClassLoader는 System ClassLoader이다.

메모리

힙, 메소드는 전체 공유자원으로 분류되고,
PC, 스택, 네이티브 메소드 스택은 쓰레드 단위의 자원으로 분류된다.

  • 메소드
    클래스 수준의 정보를 저장

    -클래스 이름, 부모클래스이름, 메소드, 변수 등
    -static 변수, 일반변수 등


  • 객체 수준의 정보저장

  • 스택
    -인스턴스 및 지역변수의 참조주소들을 저장.
    -쓰레드마다 런타임 스택을 만들고, 스택프레임(메소드 call)을 쌓는다. 에러 났을 때, 에러메시지에 런타입 스택에 메시지 쌓여있는걸 확인할 수 있다.

  • PC
    쓰레드마다 가지고 있는 Program Counter.
    현재 실행할 부분을 가르키고 있다.

  • 네이티브 메소드 스택
    -네이티브(native) 메소드 호출할 때 사용하는 별도의 스택.
    -네이티브 메소드는 java 가 아닌 c와 같은 언어(low-level) 로 구현된 메소드.
    -대표적인 예시로, Thread.currentThread().
    public static native Thread currentThread() 로 선언되어 있음.

실행엔진

  • 인터프리터
    바이트 코드를 한줄 한줄 읽어서 네이티브 코드로 변환

  • JIT (Just In Time) 컴파일러

    -바이트 코드에서 반복되는 코드 부분은 JIT 컴파일러가 미리 네이티브 코드로 변환 시켜놓음.
    -반복되는 코드가 읽힐 순서가 왔을 때, 인터프리터로 읽지않고 바로 네이티브 코드를 바로 사용한다.
    -인터프리터 읽을 때의 속도 효율성을 JIT 컴파일러가 보완하는 형태.

  • GC (Garbage Collector)
    더 이상 참조되지 않는 객체를 모아서 메모리 정리를 한다.
    경우에 따라 성능 효율을 위해 커스터마이징을 해야함.

profile
놀면서 일하고 일하면서 놀고~ 해삐~

0개의 댓글