반응형

JVM 구조

 

클래스 로더 시스템

  • .class 에서 바이트코드를 읽고 메모리에 저장
  • 로딩: 클래스 파일에서 바이트 코드를 읽어오는 과정
  • 링크: 레퍼런스를 연결하는 과정
  • 초기화: static 값들 초기화 및 변수에 할당

 

메모리

  • 메소드 영역에는 클래스 수준의 정보 (클래스 이름, 부모 클래스 이름, 메소드, 변수) 저장. 공유 자원이다.
  • 힙 영역에는 객체(.class 타입의 객체 및 인스턴스)를 저장. 공유 자원이다.

 

스택, PC, 네이티브 메소드 스택은 각 쓰레드 마다 사용하는 영역이다. 해당하는 쓰레드만 공유하는 자원이며 힙이나 메소드처럼 다른 모든 영역에 공유하는 자원은 아니다.

  • 스택 영역에는 쓰레드 마다 런타임 스택을 만들고, 그 안에 메소드 호출(method call)을 스택 프레임이라 부르는 블럭으로 쌓는다. 쓰레드 종료하면 런타임 스택도 사라진다.
  • PC(Program Counter) 레지스터: 쓰레드 마다 쓰레드 내 현재 실행할 명령어(instruction)의 위치를 가리키는 포인터가 생성된다.
  • 네이티브 메소드 스택: 네이티브 메소드를 호출할 때 사용하는 별도의 메소드 스택이다. 네이티브 메소드 인터페이스(Native 키워드)를 사용하는 메소드들은 네이티브 메소드 스택에 저장된다.
    • 네이티브 메소드의 예로 Thread 클래스의 currentThread() 메소드가 있다.

 

실행 엔진

  • 인터프리터: 바이트 코드를 한 줄 씩 실행. 즉, 바이트 코드 한 줄 마다 네이티브 코드로 컴파일한다. 똑같은 바이트 코드가 여러번 나와도 매번 한 줄씩 반복적으로 컴파일하기 때문에 비효율적이다.
  • JIT 컴파일러: 인터프리터 효율을 높이기 위해 사용된다.
    • 인터프리터는 반복되는 코드를 발견하면 JIT 컴파일러로 보내고 JIT 컴파일러는 반복되는 바이트 코드를 모두 네이티브 코드로 미리 바꿔둔다. 그 다음부터 인터프리터는 반복되는 코드를 실행할 때, 바이트 코드를 네이티브 코드로 변환하는 작업을 하지 않고 JIT 컴파일러가 컴파일한 네이티브 코드를 바로 사용한다.
  • GC(Garbage Collector): 더이상 참조되지 않는 객체를 모아서 정리한다.

 

자바 네이티브 인터페이스(JNI, Java Native Interface)

  • 자바 애플리케이션에서 C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법 제공
  • Native 키워드를 사용한 메소드 호출

 

네이티브 메소드 라이브러리

  • C, C++로 작성 된 라이브러리
  • 이를 사용하려면 자바 네이티브 인터페이스를 통해야 한다.

[참고자료]

더 자바, 코드를 조작하는 다양한 방법, 백기선

Java JVM 런타임 메모리 영역

How JVM Works – JVM Architecture?

The JVM Architecture Explained

JVM Internals

반응형

+ Recent posts