티스토리 뷰

Java

[Java] JVM

cherishee 2020. 3. 3. 20:48

JVM : Java Virtual Machine


JVM 이란

JVM : Java Virtual Machine, 자바 가상 머신의 약자를 줄여서 부르는 용어이다. JVM의 역할은 자바 어플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것이다. 그리고 JVM은 JAVA와 OS사이에서 중개자 역할을 수행하여 운영체제에 독립적인 플랫폼을 갖게 한다. 즉, 운영체제에 맞는 JVM을 설치한다면 자바 프로그램을 실행시킬 수 있다.

JVM은 프로그램의 메모리 관리를 알아서 해준다. C프로그램 같은 경우에는 직접 메모리 할당을 해주고 해지야하지만, 자바에서는 JVM이 자동으로 메모리를 관리, GC를 수행해준다.

JVM 실행과정

  1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당 받는다. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어 들여 자바 바이트코드(.class)로 변환시킨다.

  3. class 파일들을 Class Loader를 통해 JVM 메모리영역(Runtime Data Areas) 영역으로 로딩한다.

  4. 로딩된 class파일들은 Execution engine을 통해 해석된다.

  5. 해석된 바이트코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어지게된다. JVM은 필요에 따라 Thread Synchronization과 GC같은 관리 작업을 수행한다.

Java Complier

  • 자바 소스코드(.java)를 바이트 코드(.class)로 변환하는 역할을 한다.

Class Loader

  • JVM은 컴파일 타임이 아닌 런타임시에 처음으로 클래스를 참조할 때 해당 클래스를 로드하고 RuntimeDataArea에 배치한다.

RuntimeDataArea

  • 런타임 데이터 영역은 JVM이라는 프로그램이 운영체제 위에서 실행되면서 할당받은 메모리 영역이다. 런타임 데이터 영역은 5가지이다. PC Register, JVM Stack, Native method stack은 스레드마다 하나씩 생성되며, Heap, Method Area는 모든 스레드가 공유한다.

다음은 런타임시에 어떻게 클래스들과 객체 그리고 지역변수들이 할당하는지에 대한 것

PC Register

레지스터는 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 생성된다. PC레지스터는 Thread가 어떤 명령어로 실행되어야 할지에 대한 기록을 하는 부분으로 현재 수행중인 JVM명령의 주소를 갖는다.

Stack Area

이곳에는 지역변수, 매개변수, 메소드 정보, 연산중 발생하는 임시 데이터등 저장이 된다. JVM은 오직 JVM 스택에 스택 프레임을 추가하고(push) 제거하는(pop) 동작만 수행한다. 예외 발생 시 printStackTrace() 등의 메서드로 보여주는 Stack Trace의 각 라인은 하나의 스택 프레임을 표현한다.

Native method stack area

자바 프로그램이 컴파일되어 생성되는 바이트코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다. JAVA가 아닌 다른 언어로 작성된 코드를 위한 공간이다. JNI(Java Native Interface)를 통해 호출하는 C/C++등의 코드를 수행하기위한 스택 공간이다.

Heap Area

Runtime 에 동적으로 할당되는 데이터가 저장되는 영역입니다. 예를들어 객체, 배열등이 생성되었을 때 저장되는 공간이다. Heap에 할당된 데이터는 GC의 대상이다.

힙은 3가지 부분으로 나눌 수 있다.

  • Permanent Generation

    생성된 객체들의 정보의 주소값이 저장된 공간이다. 클래스 로더에 의해 로드되는 클래스, 메소드 등에 대한 메타 정보가 저장되는 영역이고, JVM에 의해 사용된다. 리플렉션을 사용하여 동적으로 클래스가 로딩되는 경우 사용한다.

  • New/Yong영역

    Eden : 객체들이 최초로 생성되는 공간

    Survivor 0 /1 : Eden에서 참조되는 객체들이 저장되는 공간

  • Old 영역

    new area에서 일정 시간 참조되고 있는, 살아남은 객체들이 저장되는 공간이다. Eden영역에 객체가 가득차게 되면 첫번째 GC가 발생한다. Eden영역에 있는 값들을 Survivor 1 영역에 복사하고 이 영역을 제외한 나머지 영역의 객체를 삭제한다.

Method Area(Class Area, Code Area, Static Area)

메소드 영역은 모든 스레드가 공유하는 영역으로 JVM이 시작될 때 생성된다. JVM이 읽어 들인 각각의 클래스와 인터페이스에 대한 런타임 상수 풀, 필드와 메서드 코드, Static 변수, 메소드의 바이트코드 등을 보관한다.

Runtime constant pool

Runtime constant pool 은 Method area 내부에 존재하는 영역으로, 각 클래스와 인터페이스의 상수뿐만 아니라, 메소드와 필드에 대한 모든 레퍼런스까지 담고 있는 테이블이다. 즉, 어떤 메소드나 필드를 참조할 때 JVM은 런타임 상수 풀을 통해 해당 메소드나 필드의 실제 메모리상 주소를 찾아서 참조하여 중복을 막는 역할을 한다.

Execution Engine

Load된 Class의 바이트 코드를 실행하는 Runtime Module이 바로 Execution Engine이다. Class Loader를 통해 JVM 내의 Runtime Data Areas 에 배치된 바이트 코드는 Execution Engine에 의해 실행되며, 실행 엔진은 자바 바이트 코드를 기계어로 변경한 뒤에 사용하게 된다. 해당 작업을 실행 엔진이 하게 된다. 그리고 바이트 코드를 기계어로 변경할 때엔 두 종류의 방식을 사용한다. 각각 Interpreter와 JIT (Just-In-Time) compiler이다.

Interpreter는 명령어를 그때그때 해석해서 실행하게 되어 있다. JIT (Just-In-Time) compiler는 인터프리터의 단점(성능,속도 등)을 보완하기 위해 도입되었다. 실행 엔진이 인터프리터를 이용해 명령어를 하나씩 실행하지만 JIT 컴파일러는 적정한 시간에 전체 바이트 코드를 기계어로 변경한다.

Native Method Interface(JNI)

Native Method Interface는 줄여서 JNI라고도 한다. JNI는 JVM에 의해 실행되는 코드 중 네이티브로 실행하는 것이 있다면 해당 네이티브 코드를 호출하거나 호출 될 수 있도록 만든 일종의 프레임워크입니다

Native Method Libraries

네이티브 메소드 실행에 필요한 라이브러리들을 뜻한다.

Garbage Collection

GC는 Java Application에서 사용하지 않는 메모리를 자동으로 수거하는 기능을 말한다. Java 언어에서는 GC 기술을 사용함에 따라서 개발자로 하여금 메모리 관리에서 부터 좀더 자유롭게 해주었다.

GC의 실행순서

  1. 참조되지 않은 객체들을 탐색 후 삭제
  2. 삭제된 객체의 메모리를 반환
  3. Heap 메모리의 재사용

출처

'Java' 카테고리의 다른 글

[Java] char to int  (0) 2020.03.23
[Java] 객체 비교 (Comparator / Comparable)  (0) 2020.03.10
[Java] Singleton  (0) 2020.03.03
[Java] Interface  (0) 2020.03.03
[JAVA] String / StringBuffer / StringBuilder  (0) 2020.01.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함