컴파일러로 java 파일이 class(바이트코드) 파일로 변경 되는 걸 봤다.
그리고 이 class 파일은 JVM 에서 읽을 수 있다.
간단하게 보면,
JDK 내부에는 컴파일러, 의존관계 분석 등 개발에 필요한 도구들이 있고,
이 JDK 가 class 파일을 만들게 되면
JRE 에는 실행에 필요한 자바 실행 명령, 클래스 로더와 바이트 코드 실행에 필요한 여러 라이브러리를 제공하고 있다.
이걸 이용해 바이트 코드를 실행하게 되면
JVM 에서 실행을 하게 된다.
JVM 은 OS 에 독립적이여서 바이트 코드를 OS 에 맞추고 ,언어를 OS 에 맞게 변경하는데
이떄 사용하는게 인터프리터와 JIT 라고 보면 된다.
이제 이 바이트 코드를 어떻게 실행하는지 알아보기 위해
JVM 과 JIT 에 대해 알아보자
JVM?
JAVA가 OS 에 독립적일 수 있는 이유가 JVM 에 있다.
JVM 이 OS에 맞게 변경을 해주기 때문에 기계어로 변환해 주는게
JVM 의 인터프리터와 JIT 다 .
JIT?
java는 성능이 느리다는 말이 있어왔는데,
그건 자바의 특징이 인터프리터(OS 에 맞게 변경하는 과정)를 하는 과정에서
인터프리터를 하기전에 컴파일 과정을 한번 걸치기 때문에 그렇다.
자바는 바이트 코드로 한번 컴파일 하고, 이 바이트 코드를 인터프리터 하는 방식이다.
여기서 인터프리터 방식은
소스 코드를 런타임시에 한줄 한줄 읽어가면서 기계어로 변환을 하는데,
속도가 느릴수 있다.
그래서 자주 사용되는 코드를 따로 한꺼번에 기계어로 변환을 시켜 두고
다시 인터프리터가 읽지 않도록 하는 방법을 JIT 컴파일러가 해준다.
즉, 인터프리터가 안 읽어도 되게 변경해준다.
JVM 구조

클래스 로더
클래스 로더는 클래스를 읽어오는 시스템인데,
로딩 -> 링크 -> 초기화 로 진행이 된다.
로딩에서는 클래스가 있는지 없는지를 파악하고,
없으면 Class Not found Exception을 발생시키고
있다면, 메모리(Runtime Data Areas) 에 저장이 된다.
메모리 (Runtime Data Areas)

-힙
힙은 객체화 된 모든 클래스 인스턴스와 배열을 저장한다.
모든 JVM 스레드에 공유되는 공유 자원이다.
힙에 저장된 메모리 회수는 무조건 GC 만 가능하다.
-메소드
메소드에는 런타임 상수풀, 필드와 메소드 데이터 내용 등
클래스 수준의 정보를 저장한다.
JVM 벤더 사마다 힙의 일부로 볼 수 도 있다.
-PC 레지스터
연산을 위해 필요한 피연산자를 임시로 저장하기 위한 용도로 사용된다.
네이티브 메서드가 아니면 현재 실행 중인 JVM 명령어의 위치가 저장된다.
- 스택
쓰레드 마다 런타임 스택을 만든다.
스택에 쌓이는 정보의 단위는 Frame 이라 하는데,
프레임은 중간 결과의 저장, 동적 링크, 값 반환, 예외 디스패치 등에 사용된다.
메서드 하나가 호출되면 새 프레임이 생성되어 스택에 쌓이고
메서드 호출이 정상 완료되거나 예외가 던져지면 프레임은 스택에서 빠져나간다.
-네이티브 메소드 스택
자바 외에 다른 언어로 작성된 메서드를 지원하기 위해 사용되는 스택이다.
실행 엔진
클래스 로딩 과정을 통해
메모리에 배치된 바이트 코드를 명령어 단위로 읽어서 실행 하게 된다.
기계가 읽을 수 있게 코드를 변경해주는건데
이때 사용되는게 인터프리터와 JIT 컴파일러다.
-JNI
JNI는 C, C++, 어셈블리어로 구축한 네이티브 메소드를 호출 할 수 있는 방법을 제공한다.
'Java > JVM' 카테고리의 다른 글
Garbage Collection (0) | 2021.02.04 |
---|---|
Stack - 메모리 관리 (0) | 2021.02.04 |
컴파일러 (0) | 2021.02.04 |
JVM 이란? (0) | 2019.11.11 |