[JAVA] JVM

Vorhandenheit ·2022년 9월 8일
0

JAVA

목록 보기
1/1

[JAVA] JVM

1. JVM 이란?

JVM (Java Virtual Machine) 으로 '자바를 실행하기 위한 가상 기계'입니다.
OS에 종속받지 않고 CPU가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터입니다.

이유

JVM을 사용하는 이유는, JAVA와 OS사이에서 중개자 역할을 수행하여 OS에 구애받지않고 재사용을 가능하게 해주며, 메모리관리, Garbage collection을 수행하여, 한정된 메모리를 효율적으로 사용할 수 있게 도와줍니다.

JVM가 가운데에 껴있기 떄문에, Java 언어로 프로그래밍된 파일을 Java컴파일러가 가상 기계어 파일인 Java 클래스 파일로 만듭니다. Java 바이트 코드로 번역합니다.

자바 실행과정

  1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받습니다.
  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어 자바 바이트코드(.class)로 변환시킵니다.
  3. Class Loader를 통해서 class파일들을 JVM으로 로딩합니다.
  4. 로딩된 class파일들은 Execution engine의 Interpreter와 JIT Complier를 통해 해석됩니다
    5.해석된 바이트 코드는 Runtime Data Areas에 배치되어 실질적 수행이 이루어지게됩니다.

(1) JVM 구성

A. Java Compiler

소스파일을 컴파일한 파일은 바이너리 코드의 형태를 가집니다. 하지만 자바에서는 바이너리 코드가 아닌 바이트 코드를 가진 바이트 파일로 변환이 됩니다.
이 바이트 파일이 .class 파일입니다.

이 바이트 코드로 작성된 .class 파일은 JVM이 읽기편하도록 만들어놓은 파일입니다.

자바 컴파일러는 JVM이 이해할 수 있도록 소스파일을 이 목적파일로 변환시키는 역할을 합니다.

B. Class Loader

동적 로딩을 통해서 클래스들을 로딩 및 링크하여 Runtime Data Area로 올립니다.

C. Execution Engine

JVM에 올라온 바이트코드(.class)들을 명령어 단위로 하나씩 가져와서 실행시킵니다.

a. JIT Compiler

JIT 컴파일러는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러입니다.

인터프리터 방식을 보완하기위해 도입되었습니다. 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에 더 이상 인터프리팅하지않고 기계어로 직접 실행하는 방식을 말합니다

b. 가비지콜렉터

더 이상 사용되지 않는 인스턴스를 찾아서 메모리에서 삭제합니다.

c. interpreter

실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행합니다. 하지만 한 줄씩 실행하기 때문에 느립니다.

D. Runtime Data Area


JVM이 프로그램을 수행하기 위해서 OS로부터 별도로 할당 받은 메모리 공간입니다.

a. PC Register

Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로 스레드마다 하나씩 존재합니다.

b. stack Area

프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성으 데이터를 저장하기위한 영역입니다.
각종 형태의 변수나 임시데이터, 스레드나 메소드의 정보를 저장합니다.
메소드를 호출할 때마다 각각의 스택 프레임이 생성됩니다.

c. Native method stack

자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌, 실제 생성할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역입니다.

d. Method Area

클래스 정보를 처음 메모리 공간에 올릴 때, 초기화되는 대상을 저장하기위한 메모리 공간입니다.
올라가게 되는 메소드의 바이트 코드는 프로그램의 흐름을 구성하는 바이트 코드입니다.

e. heap Area

객체를 저장하는 가상 메모리 공간입니다. new 연산자로 생성된 객체와 배열을 저장합니다.

f. Native Method Stack

자바 프로그램이 컴파일되어 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역입니다. JAVA가 아닌 다른언어로 작성된 코드를 위한 공간입니다.

출처

https://itminco.tistory.com/22
https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80
https://kingofbackend.tistory.com/123
https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80

profile
읽고 기록하고 고민하고 사용하고 개발하자!

0개의 댓글