이번 블로그에서는 JVM을 구성하는 클래스 로더, Runtime Data Areas, 그리고 Execution Engine에 대해 적어보려고 한다
JVM은 위 그림처럼 이루어져 있다고 한다
JVM 아키텍쳐
java로 작성된 파일이 javac에 의해 컴파일 => 그리고 .class파일로 바뀜
그 다음에 클래스 로더에 의해서 Runtime Data Areas로 각각 알맞게 들어가게 된다!
Class Loaders는 바이트 코드를 동적으로 메모리에 로딩!
필요할때마다 필요한 클래스/리소스만 로딩한다
Loading : JVM에 필요한 클래스 파일 로드!
Linking : 로드된 클래스의 verify, prepare, resolve 작업 수행
initializing: 클래스 / 정적 변수 등 초기화
Method Area - 클래스의 메타데이터들이 들어감! (스레드끼리 공유)
Heap - 인스턴스화된 객체가 들어감(GC가 메모리 낭비 어느정도 관리!)
stack - 스레드마다 생성되는데, 메소드, 지역변수등이 들어감!
PC Register - 이것도 스레드 마다 생성되는데, 각 실행중인 명령에 대한 참조를 저장!
인터프리터는 바이트 코드를 한줄 씩 읽으면서 OS가 실행할 수 있도록 기계어로 번역을 하는것 -> 초기 JVM
인터프리터 방식이어서 실행속도가 느림
JIT(Just in Time) - 동적 변환 방식을 사용해서 컴파일러됨 -> 이것도 이제는 같이 사용!!
이미 한번 읽어서 기계어로 번역한, 소스코드는 번역 안함!!
기계어로 변환된 코드는 캐시에 저장되기 때문에 다시 컴파일 안함