본문 바로가기

CS/OOP

JVM이란 무엇일가?

반응형

 

JVM 알아보기

JVM이란?

JVM의 역할은 개발자들이 작성한 Java 프로그램이나 Web 애플리케이션 Server(WAS) 등을 구별하지 않고 Java 프로그램의 범위에 들어가는 모든 것들을 실행시키는 기본 데몬이다. Java에서 프로그램을 실행한다는 것은 컴파일 과정을 통해 생성된 Class 파일을 Java Compiler가 자바 ByteCode로 변환 후 JVM으로 넘겨준다 JVM은 ByteCode를 해석(Interpret)하는 과정을 거쳐 메모리 등의 리소스를 할당하고 관리하며 정보를 처리하는 일련의 작업들을 포괄한다. ( Thread 관리 및 GC와 같은 메모리 정리 작업도 포함)

 

JVM안  각각의 기능들

  • Class  Loader : JVM내로 .class파일들을 Load 하여 Loading 된 클래스들을 Runtime Data Area에 배치된다.
  • Execution Engine : Loading 된 클래스의 자바 Bytecode를 해석(Interpret)한다. (JVM에서는 자바 바이트코드만  해석이 가능)
  • Runtime Data Area : JVM이라는 프로세스가 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간이다.

 

동작 원리

Java 프로그래밍 수행 과정을 JVM안에서는 Class Loader를 통해 Class 파일을 로딩시키고, 로딩된 Class 파일들은 Excution Engine을 통해 해석된다. (자바 바이트코드는 가상 머신이 인식할 수 있는 언어이지만 CPU가 인식할 수 있는 언어는 아니다.)

Excution Engine이 Loading 된 자바 Bytecode를 해석하여 바이너리(기계어) 코드로 변환하여 CPU가 인식할 수 있게 한다.

  1. JavaClass.java 실행
  2. Java Compiler가 자바 Bytecode 변환
  3. JVM Class Loader가 클래스를 로드
  4. Execution Engine이 자바 Bytecode를 각 OS에 맞는 바이너리 코드(기계어)로 변환한다.

Execution Engine과 JIT(Just-In-Time) 컴파일러

Execution Engine은 Interpreter 방식으로 자바 ByteCode를 한 줄씩 읽어 코드를 실행하기 때문에 동일한 메소드, 즉 중복이 많을수록 비효율 적이다. 이를 개선한 것이 JIT 컴파일러는 해석(Interpret)한 내용을 캐싱에 저장하여 동일한 메소드가 다시 실행될 경우 캐싱에 저장된 메소드를 실행한다.

Runtime Data Area 

  • Method Area : 클래스, 변수, Method, static 변수, 접근 제어자 정보, final class 변수, 상수 정보(Runtime Constant Pool), 등이 저장되는 공간 (모든 thread가 공유)
  • Heap Area : new 명령어로 생성된 인스턴스(String, Integer, Boolean)와 객체가 저장되는 구역 (모든 thread가 공유 및 Gabage Collection이 일어나는 장소)
  • Stack Area : Method 내에서 사용되는 값들(매개변수, 지역변수, 리턴 값 등)이 저장되는 구역, 메소드가 호출될 때 LIFO로 하나씩 생성되고 메소드 실행이 완료되면 LIFO로 하나씩 지워진다. (thread 각각 생성)
  • PC Register : CPU의 Register와 역할이 비슷하고, 현재 수행 중이 JVM 명령의 주소 값이 저장된다. (thread별로 하나씩 생성)
  • Native Method Stack : 다른 언어(C/C++)의 메소드 호출을 위해 할당되는 구역으로 언어에 맞게 Stack이 형성되는 구역

 

참고

Heap Area의 Memory 할당 방식

https://kotlinworld.com/310

 

JVM의 Memory 할당 방식 : Stack과 Heap Memory가 동작하는 방법

JVM의 메모리 할당 방식 JVM은 기본적으로 Stack Memory 와 Heap Memory 라 불리는 두가지 저장 공간을 이용해 메모리를 할당한다. 이들에 메모리를 할당하는 방법은 바이트 코드를 한 줄 한 줄 읽는 것이

kotlinworld.com

자바 바이트 코드와 기계어의 차이

https://gnsxorla1.tistory.com/2

 

바이너리 코드와 바이트 코드 쉬운 정의 -초보개발자-

이 둘을 쉽게 정의하기 위해 생각해야 할 것이 있다. 프로그램을 실행하는 것은 컴퓨터가 한다. 즉, 프로그램은 컴퓨터가 이해할 수 있는 형태로 작성되어 있어야 한다. 1. 바이너리 코드란? 정의

gnsxorla1.tistory.com

 

반응형

'CS > OOP' 카테고리의 다른 글