[JAVA] JVM 구조

eunniverse·2024년 3월 3일
0
post-custom-banner
  • JVM

    • 정의

      • JAVA 프로그램 실행 환경을 만들어 주는 소프트웨어
    • Specification

      • 문서는 상당히 많은 부분이 추상적으로 작성되어 있다.
      • 표준의 역할을 하는 문서가 존재하여 누구나 만들 수 있다.
      • 구현된 형태에 제약이 없다.
      • 추상화/다형성으로부터 얻을 수 있는 장점을 폭넓게 누릴 수 있다.
        ex. oracle - hotspot, IBM Open J9, AZUL Systems Zulu 등
    • 동작 구조

      1. JAVA 소스 코드가 JAVAC 에 의해 .class 파일이 된다. (컴파일 타임 환경)
      2. JVM Class Loader 는 runtime data area 에 .class 를 로딩한다. (런타임 환경)
      3. Excution Engine 은 .class 를 해석한다. (런타임 환경)
      4. 해석된 바이트 코드는 runtime data area 의 각 영역에 배치되어 수행되고, Excution Engine 에 의해 GC 작동과 스레드 동기화가 이루어진다. (런타임 환경)
    • Class Loader

      • 런타임에 동적으로 클래스를 메모리에 로딩하는 역할

      • .class 파일을 묶어서 JVM 이 운영체제로부터 할당 받은 메모리 영역인 Runtime Data Area 로 적재

      • 단계

        • 로딩
          • 자바 바이트 코드를 메소드 영역에 저장
            • 로드된 클래스
            • 부모 클래스 정보
            • 변수나 메소드 정보
            • 클래스 파일
            • class, interface, enum
        • 링크
          • 검증
            • 읽어 들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 구성되어있는지 검사
          • 준비
            • 클래스가 필요로 하는 메모리 할당
            • 클래스에서 정의된 데이터 구조 준비
          • 분석
            • 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체
            • 심볼릭 메모리 레퍼런스 ?
              • 참고하는 클래스의 특정 메모리 주소를 참조 관계로 구성한 것이 아니라 참조하는 대상의 이름만 지칭한 것
        • 초기화
          • static 변수를 설정된 값으로 초기화
      • 종류

      • 동작 방식

  • Execution Engine (실행 엔진)

    • 정의

      • 메모리에 적재된 바이트 코드를 기계어로 변경하여 명령어 단위로 실행
    • 종류

      • Interpreter (인터프리터)
        • 런타임 중에 바이트 코드를 한라인씩 읽고 실행한다.
        • 인터프리터를 사용함으로서 JAVA 가 플랫폼에 독립적이고, 이식성이 높아지지만 속도 문제가 발생한다.
      • JIT Compiler (JIT 컴파일러, Just-In-Time Compiler)
        • 인터프리터 속도 문제를 해결하기 위해 디자인된 기능이다.
        • 자주 실행되는 바이트 코드 영역을 런타임 중에 기계어로 컴파일하여 사용한다.
        • 방식
          • 어떤 코드가 자주 실행되는지 파악한 후 자주 쓰이는 코드는 머신 코드로 컴파일해서 속도를 높이다. 이후 실행 기록을 모아서 자주 쓰이는 코드를 native code 로 변환하는 작업을 JIT 컴파일러가 수행한다.
            ⇒ 프로그램을 오래 실행할 수록 프로그램 실행 속도가 빨라진다.
        • 컴파일 임계치
          • JVM 내 있는 메서드 호출 횟수 + 메서드가 루프를 빠져나오기까지 돈 횟수
            ⇒ 위의 두 개의 합계를 확인하여 메서드가 컴파일 될 자격을 얻으면 컴파일을 위한 큐에 대기하고, 컴파일 스레드에 의해 컴파일 된다.
            ⇒ 참고 (https://inspirit941.tistory.com/352)
    • Garbage Collector (가비지 컬렉터, GC)

      • 정의

        • JVM 의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역을 주기적으로 삭제하는 프로세스
      • 장점

        1. 메모리 관리, 누수 문제에 대해서 완벽하게 관리하지 않아도 된다.
      • 단점

        1. 개발자가 메모리가 언제 해제되는지 정확히 알 수 없다.
        2. GC 가 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생한다.
      • 대상 객체

        어디서든 참조하지 않는 객체 ⇒ Unreachable 한 객체다

      • 동작 원리
        - Mark And Sweep 알고리즘
        - 루트에서부터 해당 객체에 접근 가능한지에 대한 여부를 메모리 해제의 기준으로 삼는다.
        - 과정

          - Mark 과정 : Root 로부터 그래프 순회를 통해 연결된 객체를 찾아내어 각각 어떤 객체를 참조하는지 마킹한다.
         - Sweep 과정 : 참조하고 있지 않는 객체는 Heap 에서 제거한다.
         - Compact 과정 : 분산된 객체를 Heap 의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축한다.

        REFERENCE

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

profile
능력이 없는 것을 두려워 말고, 끈기 없는 것을 두려워하라
post-custom-banner

0개의 댓글