JVM 구조

정은영·2023년 9월 19일
1

Java

목록 보기
1/3

클래스 로더 시스템

클래스 로더 시스템은 .class 파일에서 바이트 코드를 읽어들여서 메모리에 저장하는 역할을 합니다.

클래스 로더 시스템이 하는 일은 크게 세 가지가 있습니다.

  • 로딩: .class 파일에서 바이트 코드를 읽어오는 과정입니다.
  • 링크: 레퍼런스를 연결하는 과정입니다.
  • 초기화: static 값들을 초기화하고 변수에 할당합니다.

메모리

  • 메소드 영역에는 클래스 수준의 정보 (클래스 이름, 부모 클래스 이름, 메소드, 변수)를 저장합니다.
    • 메소드 영역에 저장된 자원들은 공유 자원입니다. 즉, 다른 영역에서도 참조할 수 있습니다.
  • 힙 영역에서는 실제 객체를 저장합니다.
    • 힙 영역의 자원들도 공유 자원입니다.
  • 메소드와 힙 영역 외에 나머지 영역의 자원들은 스레드에서만 공유하는 자원입니다.
  • 스택 영역에는 스레드마다 런타임 스택을 만들고 그 안에 스택 프레임을 블럭으로 쌓고 있습니다. 이 스택 프레임은 메소드 콜을 이야기 합니다. 스레드를 종료하면 런타임 스택도 사라집니다.
  • 스레드마다 스레드 내 스택 프레임에서 현재 실행하고 있는 스택 프레임을 가리키는 포인터가 생성되는데 PC(Program Counter) 레지스터 라고 합니다.
  • 네이티브 메소드 스택도 스레드마다 생기는데 네이티브 메소드를 호출할 때 쌓이는 별도의 메소드 스택이라고 이해하시면 됩니다.
    • 네이티브 메소드: 메소드 앞에 native 키워드가 붙어있으며 자바로 구현된 것이 아닌 c나 c++, 어셈블리로 구현된 메소드입니다.

JNI(Java Native Interface)

자바 애플리케이션에서 C, C++, 어셈블리로 작성된 함수(= 네이티브 메소드)를 사용할 수 있는 방법을 제공합니다. 즉, native 키워드가 붙은 메소드를 호출하는 인터페이스를 JNI라고 부릅니다.

예를 들어 public static native Thread currentThread(); 를 JNI라 부르고 실제 구현을 네이티브 메소드 라이브러리라고 합니다.


실행 엔진

바이트 코드를 한줄씩 컴파일하면서 기계가 이해할 수 있도록 native 코드로 바꿔줍니다.

  • JIT 컴파일러: 한줄씩 실행하는 인터프리터의 효율을 높이기 위해서 인터프리터가 반복되는 코드를 발견하면 JIT 컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꾸게 됩니다. 그 이후로 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용합니다.
  • GC(Garbage Collector): 더이상 참조되지 않는 객체를 모아서 정리합니다.

Reference

  • 인프런, 더 자바, 코드를 조작하는 다양한 방법

0개의 댓글

관련 채용 정보