Skip to content

Latest commit

 

History

History
69 lines (66 loc) · 5.45 KB

JVM-Java.md

File metadata and controls

69 lines (66 loc) · 5.45 KB

JVM의 구조와 Java의 실행방식

JVM(Java Virtual Machine)은 Java 프로그램을 실행하기 위한 가상 머신으로, Java 바이트코드를 플랫폼에 독립적으로 실행할 수 있게 해줍니다. JVM의 구조는 크게 클래스 로더, 메모리 영역, 실행 엔진, 그리고 네이티브 인터페이스로 나눌 수 있습니다. Java의 실행 방식은 소스 코드가 바이트코드로 컴파일된 후 JVM에 의해 실행되는 과정으로 이루어집니다.

JVM의 구조

  1. 클래스 로더 (Class Loader)
    • 기능: Java 클래스 파일(.class)을 로드하여 메모리에 적재합니다.
    • 동작 단계
      • 로딩: 클래스 파일을 읽어들입니다.
      • 링킹: 클래스 간의 참조를 확인하고, 필요한 리소스를 연결합니다.
      • 초기화: 클래스의 static 초기화 블록과 static 변수를 초기화합니다.
  2. 메모리 영역
    • 메소드 영역: 클래스와 관련된 메타데이터, 상수 풀, static 변수 등을 저장합니다.
    • 힙 영역: 객체와 배열이 동적으로 할당되는 공간입니다.
    • 스택 영역: 각 스레드마다 독립적으로 존재하며, 메소드 호출 시 프레임을 스택에 쌓아 올립니다.
    • PC 레지스터: 현재 실행 중인 JVM 명령의 주소를 가리킵니다.
    • 네이티브 메소드 스택: 네이티브 메소드의 호출을 위한 스택입니다.
      • 네이티브 메소드는 뭐가 있을까요?
        • 네이티브 메소드는 자바 외의 다른 프로그래밍 언어(C, C++)로 작성된 메서드입니다. 자바 애플리케이션 성능을 최적화하거나 기존 네이티브 라이브러리를 활용하기 위해 사용됩니다.
          • 역할: 자바 코드에서 네이티브 메소드를 호출하여 운영체제의 기능을 직접 사용하거나, 기존의 네이티브 라이브러리를 활용할 수 있습니다. 이를 통해 자바에서는 할 수 없는 저수준 작업이나 성능이 중요한 작업을 수행할 수 있습니다.
          • 예시
            • 시스템 호출, 하드웨어 제어
            • 기존의 C/C++ 라이브러리 사용
            • 성능 최적화
             public class NativeExample {
                 // 네이티브 메소드 선언
                 public native void printMessage();
                 // 네이티브 라이브러리 로드
                 static {
                     System.loadLibrary("NativeExample");
                 }     
                 public static void main(String[] args) {
                     new NativeExample().printMessage();
                 }
            }
  3. 실행 엔진
    • 인터프리터: 바이트코드를 한 줄씩 읽어 해석하고 실행합니다. 초기 실행 속도가 느립니다.
      • 그럼 자바는 코드를 컴파일 후 인터프리터로 실행하는건가요?
        • 자바는 소스 코드를 컴파일하여 바이트코드로 변환한 후, JVM에서 인터프리터와 JIT 컴파일러를 상요하여 실행합니다.
        • 컴파일 단계: javac가 자바 소스 코드를 바이트코드(.class)로 컴파일합니다.
        • 실행 단계
          • 인터프리터: JVM은 바이트코드를 한 줄씩 읽어 해석하고 실행합니다. 초기 실행 시 인터프리터가 사용됩니다.
          • JIT 컴파일러: JVM은 자주 실행되는 바이트코드를 네이티브 코드로 컴파일하여 성능을 높입니다. 이렇게 컴파일된 코드는 이후 실행 시 더 빠르게 수행됩니다.
    • JIT 컴파일러: 자주 실행되는 바이트코드를 네이티브 코드로 컴파일하여 실행 속도를 높입니다.
      • 자주 사용되는 바이트코드에 어떤게 있을까요?
        • Hot Spot: JIT 컴파일러는 주로 핫스팟 이라고 불리는 자주 호출되거나 반복적으로 실행되는 코드 영역을 타겟으로 합니다.
        • 예시
          • 자주 호출되는 메서드
          • 반복적으로 실행되는 루프
          • 성능이 중요한 알고리즘
        • JIT 컴파일러는 성능 분석을 통해 핫스팟을 식별하고, 이러한 코드 영역을 네이티브 코드로 컴파일하여 실행 속도를 최적화합니다.
    • 가비지 컬렉터: 사용하지 않는 메모리를 자동으로 해제하여 메모리 누수를 방지합니다.
  4. 네이티브 인터페이스(NI)
    • JNI(Java Native Interface): Java 코드에서 C/C++ 등 네이티브 코드를 호출할 수 있게 해주는 인터페이스입니다.

Java의 실행 방식

  1. 소스코드 작성: 개발자가 .java 파일에 Java 소스 코드를 작성
  2. 컴파일: Java 컴파일러 (javac)가 소스 코드를 바이트코드 (.class)로 컴파일
  3. 클래스 로딩: JVM의 클래스 로더가 .class 파일을 로드
  4. 실행: JVM의 실행 엔진이 바이트코드를 인터프리터 또는 JIT 컴파일러를 통해 실행합니다.
  5. 메모리 관리: JVM의 가비지 컬렉터가 메모리를 관리하여 효율적인 자원 사용을 보장합니다.

답변 예시

JVM은 Java 프로그램을 실행하기 위한 가상 머신으로 클래스 로더, 메모리 영역, 실행 엔진, 네이티브 인터페이스로 구성됩니다. Java 프로그램은 소스 코드가 바이트코드로 컴파일된 후, JVM에 의해 실행됩니다. JVM은 바이트코드를 인터프리터와 JIT 컴파일러를 통해 실행하며, 가비지 컬렉터를 사용해 메모리를 관리합니다.