무작정 개발.Vlog

[Java] JVM와 바이트 코드

by 무작정 개발
반응형

이번에는  [Java] JDK, JRE 이란?  에 이어서 JVM(자바 가상 머신) 동작 원리 및 개념, 바이트 코드에 대해 정리할 것이다.

 

Java를 보다 깊게 이해하기 위해 다시 한번 복습하면서 글을 작성 중입니다.
기초적인 내용은 다루지 않을 예정입니다.

 

JVM 이란?

  • JVM 이란 Java를 실행하기 위한 가상 컴퓨터(실제 컴퓨터가 아닌 소프트웨어로 구현한 것)
  • 자바 가상 머신 (Java Virtual Machine)의 약자
  • 자바 애플리케이션을 클래스 로더(Class Loader)를 통해 읽고 자바 api와 함께 실행
  • Java 프로그램이 어느 운영체제(OS)에서도 동일하게 작동할 수 있게 해 줌
  • (단, Java 프로그램과 달리 JVM은 운영체제에 종속되고, 각 OS에 맞는 JVM을 설치해야 함)
  • Java 프로그램은 OS가 아닌 JVM과 통신하고, JVM은 Java 프로그램으로부터 전달받은 명령을 해당 OS가 이해할 수 있도록 변환하여 전달
  • GC(Garbage Collection)을 통해 자동으로 메모리를 관리해줌
GC(Garbage Collector) 이란?
가비지 컬렉션(Garbage Collector)은 줄여서 GC라고도 부른다.
GC는 Java의 메모리 관리 방법 중 하나로 JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없는 메모리 영역을 주기적으로 삭제하는 프로세스를 말한다.

Java 바이트 코드

  • JVM이 이해할 수 있는 언어로 변환된 Java 소스 코드를 의미
  • Java 컴파일러에 의해 변환되는 코드의 명령어의 크기가 [ 1 byte ]라서 Java 바이트 코드라고 불림
  • Java 바이트 코드는 자바 가상 머신(JVM)만 설치되어 있다면 어느 OS에서도 실행 가능

 

JVM 구성

하단에 2개의 JVM 구성가 있다.

1번 JVM 구성은 전체적인 JVM 구성이고, JVM 구성 2는 Runtime Data Area를 보다 자세히 표현하여 첨부하였다.

JVM 구성1 / 출처 : 자바의 정석(남궁성.저자)
JVM 구성1 / 출처 : 자바의 정석(남궁성.저자)
JVM 구성2 / 출처 : 맨 하단에 기재
JVM 구성2 / 출처 : 맨 하단에 기재

클래스 로더(class loader)

  • Java Compiler(컴파일러)를 사용해서. java 파일을. class(바이트코드)로 컴파일한다.
  • 그리고 Class Loader를 통해 JVM에 .class 파일을 load(로드)하고, 링크를 통해 배치하는 작업을 수행
  • 클래스 파일들을 엮어서 JVM이 OS로부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할을 수행
Java는 동적으로 클래스(Class)를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 소스 코드가 JVM과 연결된다.
동적으로 읽어온다는 것은 런타임 시 모든 소스 코드가 JVM에 링크되는 것을 의미한다.
-> 이렇게 동적으로 Class를 로딩해주는 역할을 하는 것이 클래스 로더(class loader)이다.

 

실행 엔진(execution engine)

  • .class 파일을 실행시키는 역할
  • 클래스 로더(class loader)에 의해 메모리에 적재된 Class(바이트 코드)들을 기계어로 변환해 명령어 단위로 실행하는 역할
  • Interpreter
    • 바이트 코드로 명령어 단위로 읽어 실행하는 인터프리터(Interpreter)
    • 1 줄씩 수행하기 때문에 느린 단점이 있음
  • JIT compiler (Just - In - Time)
    • JIT 컴파일러란 프로그램이 실행 중인 런타임에 실제 기계어로 변환해 주는 컴파일러를 의미
    • JIT 컴파일러는 인터프리터(Interpreter) 방식의 단점을 보완하기 위해 도입됨 (동적 번역(dynamic translation) 이라고도 불림)
    • 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드로 전체를 컴파일하여 네이티브 코드로 변경하고, 이후에는 네이티브 코드를 직접 실행하는 방식
    • 단, JIT 컴파일러가 컴파일하는 과정은 바이트 코드를 인터프리팅하는 것보다 훨씬 오래 걸리므로, JIT 컴파일러를 사용하는 JVM은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 확인하여, 일정 정도를 넘을 때에만 컴파일을 수행

GC(garbage collector)

  • GC는 동적 할당된 메모리 영역(Heap) 중에 더 이상 사용하지 않는 영역을 탐지하여 자동으로 삭제하는 역할
  • 개발자가 메모리를 따로 관리하지 않아도 된다.
  • GC가 수행되는 동안 GC를 수행하는 쓰레드(thread)가 아닌 다른 모든 스레드는 일시 정지된다.
  • ( 특히 Full GC가 일어나서 수 초간 모든 쓰레드가 정지(STW)한다면 장애로 이어지는 치명적인 문제가 생길 수 있다.)

RunTime Data Area

Runtime Data Area 구조 / 출처: 맨 하단에 기재
Runtime Data Area 구조 / 출처: 맨 하단에 기재

Runtime Data Area이란 Java 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간을 의미

 

개별 쓰레드에서 관리

  • PC 레지스터(PC Register)
    • 쓰레드가 실행되는 부분의 주소와 명령을 저장하는 영역
    • JVM은 스택(Stack) 기반의 방식으로 작동하는데, Stack에서 주소를 뽑아 이를 별도의 메모리 공간(PC Register)에 저장
    • 따라서, 현재의 어떤 명령을 실행해야 할 지에 대한 부분을 기록
  • JVM Stack
    • 프로그램 실행 과정에서 호출된 메서드의 파라미터, 지역 변수. 리턴 값, 연산에 사용되는 임시 값이 생성되는 영역(임시로 저장)
  • Native Method Stack
    • Java 외 언어로 작성된 네이티브 코드를 위한 메모리 영역 (ex:C/C++ 등)
    • Java 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
    • Java Native Interface를 통해 바이트 코드로 전환하여 저장

공유 쓰레드에서 관리

  • Method Area(메서드 영역)
    • 클래스 메타 데이터(클래스 멤버 변수의 이름, 데이터 타입, final 클래스 변수) 등을 저장
    • 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일(.class)을 읽고 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장
    • 이때, 그 클래스의 클래스 변수(class Variable)도 Method Area(메서드 영역)에 함께 생성됨
  • Heap Area(힙 영역)
    • GC(Garbage Collector)의 대상이 되는 영역
    • new 키워드로 생성된 객체와 배열이 생성되는 영역(jdk8이상 : static 변수, string 상수 풀)
    • 즉, 인스턴스 변수(Instance Variable)들이 생성되는 공간
Java 메모리 영역

Method Area(메서드 영역) - 클래스 메타 데이터(Field 이름, Field 타입, Class 이름 등)
Stack Area(스택 영역) - 기본형 데이터, 로컬 변수(참 조형일 경우 주소 값만 저장)가 저장되는 영역
Heap Area(힙 영역) - 참조형 데이터가 저장되는 영역

 

JVM 실행 과정

 

  1. 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요로 하는 메모리를 할당받는데 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
  2. Java 컴파일러(javac)가 자바 소스(.java) 코드를 읽어 들여 자바 바이트코드(.class)로 변환시킨다.
  3. 이 변경된 Class 파일들을 클래스 로더(Class Loader)를 통해 JVM 메모리 영역(Runtime Data Area) 영역으로 로딩한다.
  4. 로딩된 Class 파일들은 실행 엔진(Execution engine)을 통해 해석된다.
  5. 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어지게 된다. 이러한 실행 과정 속에서 JVM은 필요에 따라 Thread Synchronization과 GC 같은 관리 작업을 수행한다.

Reference

https://incheol-jung.gitbook.io/docs/q-and-a/java/jvm

 

JVM - Incheol's TECH BLOG

힙 메모리 영역은 young generation(eden, survivor1, survivor2) , old generation, permanent generation 으로 나누어 진다.

incheol-jung.gitbook.io

https://coding-factory.tistory.com/829

 

[Java] 가비지 컬렉션(GC, Garbage Collection) 총정리

 가비지 컬렉션(Garbage Collection)이란? 가비지 컬렉션은 영어로 Garbeage Collection으로 줄여서 GC라고도 부릅니다. 가비지 컬렉션은 자바의 메모리 관리 방법 중의 하나로 JVM의 Heap 영역에서 동적으로

coding-factory.tistory.com

 

https://medium.com/@js230023/%EC%9E%90%EB%B0%94-jvm%EA%B3%BC-%EB%B0%94%EC%9D%B4%ED%8A%B8-%EC%BD%94%EB%93%9C-4e754ee02490

 

자바 JVM과 바이트 코드

JVM/byte Code

medium.com

 

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기