JVM 구조
클래스 로더 시스템
● .class 에서 바이트코드를 읽고 메모리에 저장
> 바이트코드를 javac를 통해 decompile 해서 사람 눈에 쉽게 볼수 잇게 해줌
● 클래스로더 하는일
1. 로딩: 클래스(바이트코드) 읽어오는 과정
2. 링크: 레퍼런스를 연결하는 과정
3. 초기화: static 값들 초기화 및 변수에 할당
메모리
● 메모스 영역에는 클래스 수준의 정보 (클래스 이름, 부모 클래스 이름, 메소드, 변수) 저장. 공유 자원이다.
> 클래스 수준의 정보들이 메소드에 저장됨. 메소드에 저장된 건 공유자원=참조가능
● 힙 영역에는 객체를 저장. 공유 자원이다.
> 인스턴스 저장
>> 그외에 스택, PC, 네이티브 메소드 스택은 쓰레드에 국한됨. 쓰레드에서만 공유하는 자원
● 스택 영역에는 쓰레드 마다 런타임 스택을 만들고, 그 안에 메소드 호출을 스택 프레임(=메서드 콜)이라 부르는 블럭으로 쌓는다. 쓰레드 종료하면 런타임 스택도 사라진다.
> 스택 프레임(=메서드 콜)은 쓰레드마다 1개씩 만들어짐
● PC(Program Counter) 레지스터: 쓰레드 마다 쓰레드 내 현재 실행할 스택 프레임을 가리키는 포인터가 생성된다.
● 네이티브 메소드 스택 (참고: https://javapapers.com/core-java/java-jvm-run-time-data-areas/#Program_Counter_PC_Register)
> 쓰레드마다 생성. 네이티브 메소드 호출할때 쌓이는 별도의 스택
> 네이티브 메소드 라이브러리 사용하려면 네이티브 메소드 인터페이스(JNI)를 통해야함. JNI를 사용하는 메소드 스택은 네이티브 메소드 스택에 저장됨
JNI(Java Native Interface)
● 자바 애플리케이션에서 C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법 제공
● Native 키워드를 사용한 메소드 호출 ● https://medium.com/@bschlining/a-simple-java-native-interface-jni-example-in-java-andscala-68fdafe76f5f
네이티브 메소드 라이브러리
● C, C++로 작성 된 라이브러리
> 네이티브 매소드가 실제로 구현된 자체. 항상 JNI를 통해서만 사용가능
* 네이티브 메소드 : 네이티브 키워드가 붙어 있음. 구현을 C나 C++로 한 것 (예: currentThread())
실행 엔진
● 인터프리터: 바이크 코드를 한줄 씩 실행.
> 네이티브 언어로 바이트코드 한줄씩 네이티브 코드로 컴파일하는 것. but 똑같은 코드가 나와도 매번 반복. 그래서 jit 컴파일로로 보냄
● JIT 컴파일러: 인터프리터 효율을 높이기 위해, 인터프리터가 반복되는 코드를 발견하면 JIT 컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔둔다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.
> 바이트 코드를 네이티브 코드로 컴파일 하는 것 (자바 컴파일 ㄴㄴ)
● GC(Garbage Collector): 더이상 참조되지 않는 객체를 모아서 정리한다.
> 실행엔진에서 중요한 부분.
*정리
클래스로더가 읽음 > 메모리에 배치 > 실행할때 쓰레드에 맞게 스택/PC/네이티브메소드스택이 생성 > 실행엔진이 바이트코드를 한줄씩 실행, 한줄씩 하는게 비효율적이니 jit 컴파일도 사용, GC도 함
클래스 로더
'공부 > JAVA + SPRING' 카테고리의 다른 글
JAVA 스터디 1 JAVA, JVM, JDK, JRE 이해하기 (0) | 2023.06.28 |
---|---|
IntelliJ Spring Boot devtools setting 데브툴즈 셋팅 (0) | 2023.02.07 |