JVM이란?
- 자바 가상 머신
- 자바 바이트 코드를 OS에 특화된 코드로 변환(인터프리터 & JIT 컴파일러을 통해)하여 실행한다.
- 바이트 코드를 실행하는 표준이자 구현체(오라클, 아마존, Azul등의 밴더가 구현)
- 특정 플랫폼에 종속적이다.
JRE란?
- JVM + 라이브러리
- 자바 어플리케이션을 실행할 수 있도록 구성된 배포판
- 개발 관련 도구 포함X
JDK란?
- JRE + 개발 툴
- Write Once Run Anywhere
자바란?
- 프로그래밍 언어
- JDK에 들어있는 자바 컴파일러(javac)를 사용하여 바이트코드로 컴파일 할 수 있다.
JVM 언어
- JVM 기반으로 동작하는 프로그래밍 언어
- JVM은 바이트 코드로 이뤄진 class 파일을 읽어서 사용함
-> java언어가 아닌 다른 언어로 코딩해도 class파일로 컴파일 시 JVM에서 사용 가능
=> JVM의 축적된 훌륭한 기능들 및 안전성 사용해 어플리케이션 제작
- 클로저, 그루비, JRuby, Kotlin 등
JVM 구조
- 클래스 로더 시스템 : .class 파일에서 바이트 코드를 읽고 메모리에 저장
- 로딩 : 클래스를 읽어오는 과정
- 링크 : 레퍼런스를 연결하는 과정
- 초기화 :static 값들 초기화 및 변수에 할당
- 메모리 :
- 메소드 영역 : 클래스 수준의 정보( 클래스 이름, 부모 클래스 이름, 메소드, 변수)를 저장, 공유 자원, 상수 풀 존재해 상수("abc"...) 저장
- 힙 영역 : 객체를 저장, 공유 자원
- 스택 영역 : 런타임 스택을 만들고 그 안에 메소드 호출을 쌓는다 (스레드 마다 가짐)
- PC 레지스터 : 쓰레드 마다 쓰레드 내 현재 실행할 스택 프레임을 가리키는 포인터 생성
- 네이티브 메소드 스택 : 네이티브 메소드를 위한 스택(ex) createThread()
- 실행 엔진 :
- 인터프리터 : 바이트 코드를 한줄 씩 실행
바이트 코드를 한줄 씩 컴파일 후 실행하는 것 -> 같은 코드를 계속 컴파일하는 것은 낭비 -> JIT 컴파일러 사용
- JIT 컴파일러 : 인터프리터 효율을 높이기 위해 인터프리터가 반복되는 코드 발견 시 JIT 컴파일러로 반복되는 바이트 코드를 네이티브 코드로 바꿔두면 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.
- GC : 더 이상 참조 되지 않는 객체들을 모아서 정리
- JNI(Java Native Interface) : 자바 에플리케이션에서 C,C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법을 제공, Native 키워드를 사용한 메소트 호출
- 네이티브 메소드 라이브러리 : C,C++로 작성 된 라이브러리
클래스 로더
-
로딩, 링크, 초기화 순으로 진행
-
로딩
- 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들어 메소드 영역에 저장
- 메소드 영역에 저장하는 데이터
- FQCN(Fully-Qualified Class Name)
- 클래스 인지 인터페이스 인지 이늄인지
- 메소드 & 변수
- 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 힙 영역에 저장
-
링크
- Verify, Prepare, Resolve 단계로 진행
- Verify : .class 파일 형식이 유효한지 체크
- Prepare : 클래스 변수(static 변수) 와 기본 값에 필요한 메모리 준비
- Resolve : 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체
( ex)처음에 Book book = new Book()에서 book이 실제 new된 레퍼런스를 가리키지 않고 논리적인 곳을 가리키고 있는데 이걸 실제 메모리 주소를 가리키게 함)
메모리 레퍼런스이므로 논리 영역 가리키다가 메소드 영역 가리킴(heap 영역x)
-
초기화
- Static 변수의 값을 할당(static 블럭이 있으면 이때 실행)
-
클래스 로더는 계층 구조로 이뤄져 있으며 기본적으로 세가지 클래스 로더가 제공
-
부트 스트랩 클래스 로더 :
JAVA_HOME/lib 에 있는 코어 자바 API를 제공
최상위 우선순위를 가진 클래스 로더
-
플랫폼 클래스로더 : JAVA_HOME/lib/ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽음
-
애플리케이션 클래스 로더 : 애플리케이션 클래스패스에서 클래스 읽음
출처 :
https://www.inflearn.com/course/the-java-code-manipulation