JVM (Java Virtual Machine)

Java에서 프로그램을 실행 한다는 것은 컴파일 과정을 통해서 생성된 Class파일을 JVM으로 로딩하고 ByteCode를 해석(interpret) 하는 과정을 거쳐 메모리 등의 리소스를 할당하고 관리하며 정보를 처리하는 일련의 작업들을 포괄한다.

자바 가상머신

Thread 관리 및 Garbage Collection과 같은 메모리 정리 작업도 수행함.

  • 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행 하는것
  • JVM은 Java와 OS 사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애 받지 않고 재사용을 가능하게 해줌
  • 메모리관리, Garbage collection을 수행
  • 스택 기반의 가상머신
  • "한번 작성해, 어디에서나 실행한다" 는 원칙!

JVM 구성 요소

JVM Architecture Diagram

ClassLoader를 통해 Class파일들을 로딩하고, 로딩된 Class파일들은 Execute Engine을 통해 해석 됨

해석된 프로그램은 Runtime Data Areas에 배치되어 실질적인 수행이 이루어짐

Java Source

사용자가 작성한 Java 코드 이다.

Java Compiler

Java Source를 JVM이 해석 할 수 있는 Java ByteCode로 변경

ClassLoader

JVM 내로 .class 파일들을 Load하여 Loading된 클래스들을 Runtime Data Area에 배치된다.

Execution Engine

Loading된 클래스의 ByteCode를 해석(interpret) 한다.

Runtime Data Area에 할당된 바이트 코드들은 ExecutionEngine에 의해 실행이 된다. 실행 엔진은 바이트 코드를 읽고 실행한다.

  • InterPreter : 바이트 코드명령어를 하나씩 읽어서 해석하고 실행.
    하나하나 해석은 빠르지만 전체적인 실행속도는 느리다는 단점.
  • JIT(Just In Time) Compiler : 인터프리터의 단점을 보완하기 위해 도입된것이 JIT.
    역할 : 인터프리터 방식으로 실행 되다가 같은 코드를 매번 해석하지 않고 실행 할때 컴파일을 하면서 해당코드를 NativeCode로 변경후에 캐싱한다. 이후에는 바뀐 부분만 컴파일하고 나머지는 캐싱된 코드를 사용함으로써 인터프리터의 속도를 개선할 수 있다.
  • Garbage Collector : 참조 되지 않는 오브젝트를 수집하고 제거

Runtime Data Area

JVM 이라는 프로세스가 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간

Method Area

클래스, 변수, Method, static 변수, 상수 정보 등이 저장되는 영역이다.( 모든 Thread가 공유한다)

Heap Area

New 명령어로 생성된 인스턴스와 객체가 저장되는 구역 (GarbageCollection 이슈는 이 영역에서 일어나며, 모든 Thread가 공유)

Stack Area

Method 내에서 사용되는 값들( 매개변수, 지역변수, 리턴값) 등이 저장되는 구역으로 메소드가 호출될때 LIFO(last in first out : 마지막에 나온것이 먼저 나간다) 로 하나씩 생성되고 메소드 실행이 완료되면 LIFO로 하나씩 지워진다.

(각 Thread 별로 하나씩 생성됨)

PC Register

CPU의 Register와 역할이 비슷하다. 현재 수행중인 JVM 명령의 주소값이 저장된다( 각 Thread별로 하나씩 생성)

Native Method Stack

다른 언어(C/C++) 의 메소드 호출을 위해 할당되는 구역으로 언어에 맞게 Stack이 형성되는 구역

참고

https://d2.naver.com/helloworld/1230

JVM Performance Optimizing 및 성능 분석 사례 -1장 JVM 메모리 구조

'ProgramLanguage > Java' 카테고리의 다른 글

JNDI (Java Naming and Directory Interface)  (0) 2020.08.30
Java8- Default 메서드(Abstract, Interface)  (0) 2020.03.18
JVM 튜닝  (0) 2020.02.10
Lambda_Expression(2)  (0) 2020.01.25
객체 지향 설계 5원칙 - SOLID  (0) 2019.12.26

+ Recent posts