반응형

JVM이 뭐야?

JVM(Java Virtual Machine)은 바이트코드(.class)를 OS에 특화된 코드(기계어)로 변환하고, 이를 실행하는 '가상의 머신'이다. 특정 OS에 특화된 코드로 변환하기때문에 OS 종속적이다. JVM은 JRE에 내포되어 있다.

 

JVM

 


JRE는 뭔데?

JRE 구조

 

JRE(Java Runtime Environment)는 자바 어플리케이션을 실행할 수 있도록 구성된 배포판이다. 자바 어플리케이션을 실행한다는 것은 코드를 '실행'한다는 것인데 바로 이를 JRE에 포함된 JVM이 처리한다. 코드를 실행하는데 있어 꼭 필요한 java.util, java.io, java.net 등의 라이브러리도 포함되어 있기에 JRE의 구조는 위처럼 JVM + Library 로 구성된다.

 


JDK는 뭔데?

JDK(Java Development Kit)는 자바 어플리케이션 개발에 필요한 도구 및 라이브러리를 JRE와 함께 제공하는 개발 키트이다. 개발에 필요한 javac, jconsole, javadoc 과 같은 도구와 컬렉션 프레임워크, 파일 I/O, 스트림 API, 데이터 액세스 관련 라이브러리를 제공하는 것이다.

 

JVM , JRE, JDK 의 구조

 

 


Oracle Java 11 버전부터는 JRE를 따로 제공하지 않아요

Oracle 홈페이지에 들어가면 Java 8의 경우 JRE를 따로 제공했지만, Java 11 이상은 제공하지 않음을 확인할 수 있다.

 

JRE와 JDK를 각각 지원하던 Java 8

https://www.oracle.com/kr/java/technologies/javase/javase8-archive-downloads.html

 

Java Archive Downloads - Java SE 8 | Oracle 대한민국

죄송합니다. 검색 내용과 일치하는 항목을 찾지 못했습니다. 원하시는 정보를 찾는 데 도움이 되도록 다음을 시도해 보십시오. 검색에 사용하신 키워드의 철자가 올바른지 확인하십시오. 입력

www.oracle.com

 

JDK만 지원하는 Java 11 이상 버전

https://www.oracle.com/kr/java/technologies/javase/jdk11-archive-downloads.html

 

Java Archive Downloads - Java SE 11 | Oracle 대한민국

WARNING: These older versions of the JRE and JDK are provided to help developers debug issues in older systems. They are not updated with the latest security patches and are not recommended for use in production. For production use Oracle recommends downlo

www.oracle.com

 


JVM의 구조

 

JVM 구조

 

 


Class Loader

Class Loader

 

 Java는 동적로딩을 하는 특징이 있다. 이 동적로딩을 담당하는 부분이 바로 클래스 로더이다.

 

동적로딩
어플리케이션 실행 시점에 모든 클래스 파일을 메모리에 올려두는 것이 아닌, 필요할 때 하나씩 메모리에 올리는 방식을 말한다. 즉, 런타임시 동적으로 클래스파일을 로드하는 것이다.

 

클래스 로더는 class 파일을 읽어 OS에서 할당한 JVM의 메모리 영역으로 동적 로딩한다. 이 과정은 로딩, 링크, 초기화라는 3단계로 구성된다.

 

로딩

.class 파일(바이트 코드)을 읽고, 이를 JVM 메모리의 메서드 영역에 저장한다.

저장되는 정보는 FQCN, 타입(클래스인지, 인터페이스인지, 이늄인지), 메서드, 변수이다.

리플렉션 API를 통해 읽어오는 FQCN, 메서드, 파라미터, 멤버필드와 같은 클래스 정보를 바로 이 메서드 영역에서 읽어온다.

 

* 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 힙 영역에 저장한다.

 

FQCN(Fully Qualified Class Name)
패키지 경로를 포함한 클래스 풀 네임을 말한다.

 

링크

.class 파일이 유효한지 검증하고 클래스가 필요한 메모리 양을 미리 할당하며, 클래스가 참조하는 실제 메모리 주소값을 할당한다. 위 작업들은 검증단계, 준비단계, 분석단계로 구분된다.

 

검증단계 : class 파일이 유효한지 검증한다. 

준비단계 : 클래스가 필요한 메모리 양을 미리 할당한다. 

분석단계 : 클래스가 참조하는 실제 메모리 주소값을 할당한다.

 

초기화

클래스 변수(static 변수)를 초기화한다.

 

 

클래스 로더의 종류

클래스 로드 요청을 받으면 캐시에서 로드하고, 캐시에 없을 시 상위 클래스 로더부터 하위 클래스 로더 순으로 요청받은 클래스의 로드 작업을 수행한다.

 

클래스 로더의 계층구조

 

 

BootStrap Class Loader > JAVA_HOME/lib 경로에 있는 자바의 기본 클래스 로드

 

Plaform Class loader > JAVA_HOME/lib/ext 경로에 있는 자바의 확장 클래스 로드

 

Application Class loader > -classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치에서 클래스를 로드 


JVM 메모리

 

메서드 영역

클래스 수준의 정보 (클래스 이름, 메서드, 변수, 부모클래스 이름)가 저장된다.

여러 쓰레드들이 공유하여 사용하는 공유자원 영역이다.

 

힙 영역

생성한 인스턴스들이 저장된다. 여러 쓰레드들이 공유하여 사용하는 공유자원 영역이다. 힙 영역의 인스턴스는 GC에 의해 메모리에서 제거된다.

 

스택영역

 스택영역에는 쓰레드마다 런타임 스택을 만들고, 그 안에 메서드 호출을 스택 프레임(메서드 콜)이라 부르는 블럭으로 쌓는다. 쓰레드를 종료하면 런타임 스택도 사라진다. 예외가 발생했을 때 로그에 쭉 쌓이는 스택들이 바로 스택영역으로부터 추출한 데이터들이다.

스택 영역에서 조회한 스택

 

PC 레지스터

쓰레드마다 현재 어느 메서드를 콜하고 있는지를 가리키는 포인터를 저장하는 곳이다.

 

네이티브 메서드 스택

네이티브 메서드를 호출할 때 사용하는 별도의 스택이 저장된다.

 

JNI(Java Native Interface)

 자바 어플리케이션에서 C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법을 제공하는 인터페이스이며, native 키워드가 붙어 있다. Thread의 currentThread() 메서드 또한 네이티브 인터페이스 중 하나이다.

 

Thread.currentThread()

 

Native Method Library

 C, C++로 작성된 네이티브 라이브러리이다.

 

 

* 스택과 PC 레지스터, 네이티브 메서드 스택은 쓰레드별로 생성되며, 쓰레드끼리 공유하지 않는다.

 


실행엔진

 

인터프리터

 바이트 코드를 한줄 씩 실행하는 프로그램이다.

 

JIT 컴파일러

 인터프리터 효율을 높이기 위해, 인터프리터가 반복되는 코드를 발견하면 JIT 컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔둔다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.

 

GC(가비지 컬렉터)

 더 이상 참조되지 않는 인스턴스들을 정리해주는 프로그램이다.

 


출처

더 자바, 코드를 조작하는 다양한 방법 - 인프런 백기선님 강의

https://www.youtube.com/watch?v=-p5vM1PSOVs - 개발자 장고님의 유투브 동영상

반응형

+ Recent posts