728x90
Java virtual machine - Wikipedia
Wikipedia를 참고해 내용을 정리했다.
1. JVM 개요
- java bytecode로 컴파일 될 수 있는 언어들을 실행할 수 있는 가상 머신
- 가상 머신은 하드웨어가 달라도 실행 가능하도록 호환성을 보장한다.
- JVM은 OpenJDK project에서 오픈소스로 개발된다
2. JVM 명세
- JVM은 사양이 정의된 가상 컴퓨터 이다.
- 이 이후에 내용은 정의된 사양에 관한 내용이다
3. Class loader
- JVM 바이트 코드의 구성 단위 중 하나는 class 이다.
(바이트 코드로 작성돼 있는 파일 중 일부가 .class 확장자 형식의 파일이다) - Class loader는 Java의 .class 확장자 파일 형식을 인식하고 로드할 수 있어야 한다.
- 순서는 아래와 같다
- Loading: 타입에 대한 binary 데이터를 찾고 가져온다.
- Linking : Verification, Preparation, Resolution
- Verification : 가져온 타입이 정상적인지 확인한다
- Preparation : class 변수들을 위한 메모리를 할당하고 초기값을 할당한다
- Resolution : 상징적 참조를 직접 참조로 변환한다. (Symbolic references in Java - Stack Overflow)
- Initialization : 클래스 변수를 적절한 시작 값으로 초기화 하는 Java 코드 호출한다
- 일반 적으로 3가지 타입의 class loader가 있다.
- bootstrap class loader
- extension class loader
- application class loader
4. Architecture
- JVM은 구체적인 타입의 데이터들로 동작한다.
- type은 primitive 타입과 reference 타입이 있다.
- primitive 타입 : int, long 등
- reference 타입 : Class, Interface, Array 등
- heap
- Garbage Collector가 동작한다
- 오브젝트들과 배열들은 저장한다.
- method area
- 따지자면 heap의 일부분 이지만 보통 구분한다.
- 코드와, 상수, 클래스 정보 등이 저장된다.
- Garbage Collector가 동작하지 않는다.
- call stack
- 각 thread마다 call stack을 가지고있다.
- frame들을 저장한다.
- frame은 메서드가 불려질때 생성되고 끝날때 없어진다.
- 각 frame은 operand stack과 지역 변수들의 배열을 제공한다.
- operand stack(피연산자 스택)
- 계산을 위한 operand들에 사용된다.
- 메서드의 return 값을 받는데 사용된다.
- 지역 변수들
- 메서드 인자를 전달하기 위해 레지스터와 같은 용도로 사용된다.
- operand stack(피연산자 스택)
- JVM은 stack machine & register machine 이다.
5. Bytecode instructions (List of Java bytecode instructions - Wikipedia)
- JVM은 Operand stack management (push/pop) 등과 관련된 일들의 instruction을 가지고 있다
(instruction은 JVM 명령어 문법이라고 생각하면 된다 -) - 운영체제마다 JVM과 runtime의 구현이 필요하다.
- JVM은 bytecode를 동일하게 해석하지만, (운영체제마다) 실제 구현을 다를 수 있다.
- 각 운영체제에 맞게 Java core API를 호환성있고 효율적으로 구현해야 한다.
- 내생각 - 즉, instruction 명령어를 운영체제에 맞게 구현해야함.
6. JVM languages
- JVM language란 JVM에서 동작하는 class 확장자 파일로 바뀔 수 있는 언어이다.
- class 파일
- class 파일은 JVM instruction들과 sysmbol table 등을 포함하고 있다.
- class 파일은 컴파일된 class와 interface들을 표현하기 위한 hardware와 OS 종속적인 binary foramt이다.
- JRuby, Jython는 Rupy Python을 포팅한 것이다
- 새로 만들어진 언어 중 인기 있는 언어는 Clojure, Groovy, Scala, Kotlin 등이 있다.
- JVM 언어들은 서로 호환이 가능하다. java 프로그램에 scala 라이브러리가 쓰일 수 있다.
- java7 JVM 부터는 동적 타입 언어도 지원한다.
7. Bytecode verifier
- 실행되기전 모든 byte code를 검증한다. 3가지로 타입으로 이뤄져 있다.
- branch들이 유효한 위치에 있는지.(코드의 흐름을 벗어나는지 확인)
- 데이터는 초기화되고 참조는 type-safe 한지.
- private 한 data와 method에 대한 접근은 통제되는지
- 첫번째와 두번째는 class가 로딩될 때 검증한다.
- 세번재는 동적으로 다른 class가 data와 method에 처음 접근할 때 이루어진다.
8. Bytecode interpreter and just-in-time compiler(JIT)
- hardware architecture 마다 다른 Java bytecode interpreter가 필요하다
- Java byte code가 interpreter에 의해 실행 될때 native machine language보다 느렸다. 그래서 JIT 컴파일러가 탄생
- JIT 컴파일러
- just-in-time 컴파일러
- JIT 컴파일러는 프로그램을 실행하는 동안 Java bytecode를 native machine language로 변환할 수 있다.
- 변환된 프로그램 일부분은 interpreter보다 빠르게 동작한다.
- 이 기술은 프로그램의 자주 실행되는 부분에 적용된다
- Java가 Java byte code(.class)로 반드시 연결될 필요는 없다. 곧바로 기계어로 컴파일할 수 있다.
혹은 다른 언어가 Java byte code로 컴파일될 수도 있다. - 일부 JVM 구현에 인터프리터 없이 JIT 컴파일러만 있는 경우도 있다.
9. 정리 (내생각)
- java(.java)가
- java byte code(.class) 로 변환
- JVM 이 실행
- JVM 은 하드웨어와 운영체제에 따라 구현 필요
- JVM 은 요구사항들을 구현해야 함
- class loader(loading, linking, Initialization)
- architecture(heap, method area, call stack)
- bytecode instruction list - java bytecode를 구성하는 명령어들
- verifier(코드 순서, 데이터 초기화 & type-safe, private 접근제한)
- interpreter & JIT compiler
728x90
'Language > Java' 카테고리의 다른 글
[Java] GC - Garbage Collector (0) | 2023.04.10 |
---|
댓글