본문 바로가기

개발/JVM

JVM 기초

| 자바 파일(Java file), 클래스 파일(Class file)

 

자바 파일은 확장자가 .java 인 파일로서 자바 언어로 작성된 소스 파일을 뜻합니다. 그리고 이 자바 파일을 자바 컴파일러로 컴파일한 파일이 바로 .class 확장자를 가진 클래스 파일(바이트 코드)입니다. 우리가 흔히 이클립스와 같은 IDE 혹은 커맨드 라인에서 javac 명령어를 통해 컴파일했을 때 나오는 파일이죠. 이 클래스 파일을 가지고 자바의 클래스 로더(Class Loader)가 JVM으로 클래스 파일을 로딩합니다.


| JVM, JRE, JDK 

 

JVM(Java Virtual Machine):

-바이트 코드를 실행하는 표준이자 구현체입니다 클래스 파일을 OS에 특화된 코드로 변환하여 실행합니다

 

JRE(Java Runtime Environment): JVM + Library

-자바 어플리케이션을 실행할 수 있도록 구성된 배포판입니다. 개발툴은 포함되어 있지 않습니다

 

JDK(Java Developement Kit): JVM + Library + Tool

-javac, javap, java, visualV 등 개발툴을 포함합니다

-오라클은 자바 11부터 JDK만 제공하며 JRE를 따로 제공하지 않습니다

 

참고로 다양한 벤더사가 JDK를 제공중입니다

예) Oracle JDK, Zulu JDK, Zing JDK, AdoptOpenJDK, Amazon Corretto, RedHat JDK, OpenJDK

 

 

-자바 파일부터 JVM까지 프로세스

 


| JVM  구성


클래스 로더(Class Loader):

로딩이란 클래스 로더(Class Loader)가 확장자가 .class 클래스 파일의 위치를 찾아 그것을 JVM위에 올려놓는 과정을 뜻합니다. 여기서 중요한 것은 우리가 만든 .class 확장자를 가진 클래스 파일을 로딩하기 전에 이미 JVM을 실행하기 위해서 여러 클래스 파일들이 미리 로딩되어 있다는 점입니다

JVM을 실행했을 시 각 클래스 로더들은 자신이 호출할 수 있는 클래스들을 호출하여 JVM을 동작하고 클래스들을 JVM에 로딩하게 됩니다.

 

-부트스트랩 클래스 로더(Bootstrap Class Loader):

$JAVA_HOME/jre/lib/rt.jar 에서 rt.jar에 있는 JVM을 실행시키기 위한 핵심 클래스들을 로딩합니다

 

-확장 클래스 로더(Extenstion Class Loader):

$JAVA_HOME/jre/lib/ext 경로에 위치해 있는 자바의 확장 클래스들을 로딩하는 역할을 합니다. 

 

-시스템 클래스 로더(System Class Loader):

$CLASSPATH에 설정된 경로를 탐색하여 그곳에 있는 클래스들을 로딩하는 역할을 합니다.

저희가 만든 .class 확장자 파일을 이 녀석이 로딩합니다.

 

* 클래스로더는 클래스 파일을 읽어오는 '로딩' 기능뿐만 아니라 레퍼런스를 연결하는 '링크' 기능과 static 값들을 초기화하여 변수에 할당하는 '초기화' 기능을 수행합니다.


메모리(JVM Memory)

 

-힙(Heap):

 사용자가 관리하는 인스턴스가 생성되는 공간으로 객체를 동적으로 생성하면 인스턴스가 Heap 영역의 메모리에 할당되어 사용됩니다

 힙 영역은 Garbage Collection의 대상이 되는 영역입니다

 

-메소드(Method Area):

 클래스 수준의 정보들이 저장되는 공간입니다 (클래스 이름, 필드, 변수, 메소드 등) 

 

-스택(JVM Language Stacks): 

 스레드마다 런타임 스택을 만들고, 메소드 호출을 쌓아 놓는 곳입니다, 쓰레드가 종료되면 스택에 저장된 정보도 사라집니다

 

-PC(PC Registers):

 현재 실행할 스택 프레임을 가리키는 역할을 합니다

 

-네이티브 메소드(Native Method Stacks):

 네이티브 메소드가 실행되기 위한 공간입니다, 네이티브 메소드는 JAVA가 아닌 C/C++로 작성되어 있으며

 JNI(Java Native Method Interface)를 통해 실행됩니다


실행 엔진(Execution Engine)

 

-인터프리터(Interpreter):

 바이트 코드를 한 줄씩 읽어서 처리하는 컴파일러입니다

 

-JIT 컴파일러(Just-In-Time Compiler):

 인터프리터의 효율을 높이기 위해 반복되는 바이트코드를 네이티브 코드로 미리 변화시켜 놓는 역할을 합니다

 

-GC(Garbage Collector):

 힙 영역에서 더 이상 참조되지 않는 객체들을 정리하는 역할을 합니다


출처 및 참고:

https://itmore.tistory.com/entry/자바-클래스-로딩-과정 [IT모아]

https://www.edureka.co/

 

'개발 > JVM' 카테고리의 다른 글

Garbage Collection  (0) 2020.01.19