JVM 구조
클래스 로더 시스템
.class에서 바이트코드를 읽고 메모리에 저장
로딩 : 클래스 읽어오는 과정
링크 : 레퍼런스를 연결하는과정
초기화 : static 값들 초기화 및 변수에 할당
메모리
메소드(Method) 영역은 클래스 수준의 정보(클래스이름, 부모 클래스 이름, 메소드, 변수 정보 등과 같은 모든 클래스 수준 정보가 저장된다. JVM당 하나의 메소드 영역만 있으며 공유 자원이다.
힙(Heap) 영역은 모든 객체의 정보가 저장된다. JVM당 하나의 힙 영역도 있다. 또한 공유 자원이다.
스택(Stack) 영역은 모든 스레드에 대해 JVM은 여기에 저장되는 하나의 런타임 스택을 생성합니다. 이 스택의 모든 블록은 메서드 호출을 저장하는 활성화 레코드/ 스택 프레임이라고 한다. 해당 메서드의 모든 지역 변수는 해당 프레임에 저정된다. 스레드가 종료된 후 런타임 스택은 JVM에 의해 사라진다. 공유 자원이 아니다.
PC(Program Counter) 레지스터 : 스레드의 현재 실행 명령 주소를 저장한다. 각 스레드에는 별도의 PC레지스터가 있다.
네이티브 메서드 스택(Native Method Stack) : 모든 스레드에 대해 별도의 네이티브 스택이 생성된다. 기본 메서드 정보를 저장한다. https://javapapers.com/core-java/java-jvm-run-time-data-areas/#Program_Counter_PC_Register
실행 엔진
인터프리터 : 바이트 코드를 한줄 씩 실행한다.
JIT 컴파일러 : 인터프리터 효율을 높이기 위해, 인터프리터가 반복되는 코드를 발견하면 JIT 컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔둔다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.
GC(Garbage Collector) : 더 이상 참조되지 않는 객체를 모아서 정리한다.
JIN(Java Native Interface)
자바 애플리케이션에서 C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법 제공한다.
Native 키워드를 사용한 메서드를 호출한다.
네이티브 메소드 라이브러리 https://schlining.medium.com/a-simple-java-native-interface-jni-example-in-java-and-scala-68fdafe76f5f
C, C++로 작성된 라이브러리
참고
백기선님의 The Java code Manipulation 강의 중.