본문 바로가기

CS/JAVA

JVM 구조

JAVA는 OS와 상관없이  Window, Linux, MacOS 등 어디에서든 실행할 수 있다. C언어와 다르게 자바는 JVM위에서 실행되므로 OS를 가리지 않는 것이다. 다만 OS에 맞는 JVM을 별도로 설치해줘야 한다. 따라서 우리는 플랫폼에 상관없이 하나의 자바 소스와 자바 컴파일러를 통해 코드를 실행할 수 있게 되었다.

 


JVM(Java Virtual Machine)

자바 가상머신이라고 불리며 자바와 운영체제 사이에서 중개해주는 역할을 하며, 자바 언어가 CPU나 운영체제에 구애받지 않고 실행될 수 있도록 도움을 준다.

JVM 구조

Java source : 사용자가 작성한 자바 코드

Java Compiler : 기계가 읽을 수 있도록 해석하여 Byte Code로 변환

Class File : 자바 컴파일러에 의해 변환된 byte code. (.class 파일)

 

동작과정

  1. 프로그램이 실행되면 JVM은 OS로부터 메모리 공간을 할당 받는다.
  2. 사용자가 작성한 자바 소스 파일은 자바 컴파일러에 의해 클래스 파일(바이트 코드)로 변환된다.
  3. 변환된 클래스 파일들은 클래스 로더를 통해 JVM에 링크된다.(Runtime Data Area에 배치)
  4. 클래스 파일들은 Execution Engine에 의해 해석되어진다.

 

Class Loader

바이트 코드의 내용대로 변수, 메소드, 타입들을  Runtime Data Area에 저장하는 과정(.class 파일들을 JVM에 올리는 과정)

동적으로 클래스를 로드한다. 즉, 클래스 사용 시점에 로딩 과정이 이루어짐.

클래스 로딩 과정

  • Loading
    • 클래스 로더가 class 파일을 읽은 후, 바이너리 데이터를 만들어 Method Area에 데이터를 저장한다.(Class Loder 뿐만 아니라 Execution Engine의 동작도 포함되어 있는 전반적인 동작과정을 말함)
    • 메소드, 변수, 타입 정보 등이 저장된다.
    • 자식 클래스가 저장되면 부모 클래스 정보 또한 저장된다.
    • 로딩이 끝나면 Class 객체를 생성해 Heap Area에 인스턴스를 저장한다.
    • Bootstrap←Extension← Application 3가지의  계층구조를 가진다.
  • Linking
    • verify(검증) → prepare(준비) → Resolution(해석) 과정으로 진행됨
    • verify에서는 읽은 데이터가 유효한 것인지 확인
    • prepare에서는 Static 필드가 생성되고, 기본값으로 초기화된다.
    • Resolution에서는 런타임 상수풀에 있는 Symbolic Reference를 direct reference로 바꾸는 프로세스(실제 메모리 주소값으로 변경)
      • Symbolic Reference : 참조된 항목에 관한 이름이나 기타 정보를 제공하는 문자열로, 실제 객체를 가져오는데 사용
  • Initialization
    • 로드된 각 클래스나 인터페이스의 초기화 로직 실행
    • 정적 변수들이 정의된 값으로 초기화

 

Execution Engine

클래스 로더에 의해 Method Area에 저장된 바이트 코드를 Execution Engine에서 실행시킨다. 다시말해, Execution Engine은  로드된 바이트 코드를 실행하는 역할을 한다. 

자바는 인터프리터와 컴파일러를 모두 사용한다.

인터프리터 : 자바스크립트, 파이썬

컴파일러 : C언어

인터프리터와 컴파일러의 차이

- 인터프리터는 한 라인씩 읽고 실행하는 반면, 컴파일러는 전체를 스캔하여 모두 Native Code로 변환한다.

  • Interpreter
    • Byte Code를 OS에 맞는 Native Code로 바꾸는 작업
    • 각 행을 컴파일하고 변환하는 과정을 거치며, 중복되는 코드마저 매번 컴파일하여 비효율적이다.
    • 중복되는 코드는 JIT Compiler를 사용하여 처리
  • JIT Compiler
    • Just In Time Compiler
    • Byte Code 전체를 읽어 한번에 변환할 수 있음
    • Native Code는 캐시에 보관해서 같은 코드가 나오면 캐싱된 코드를 사용
    • 하지만 한번에 다 읽어와서 실행한다면 초기시간이 오래걸림
    • 따라서 처음에는 Interpreter로 해석하고, 중복되는 코드가 많이 나올 경우 JIT 컴파일러를 사용
  • GC
    • Garbage Collector
    • Heap 영역의 더 이상 참조되지 않는 객체들의 메모리 영역을 정리한다.
    • 시스템에 의해서 자동으로 정리됨.

 

Runtime Data Area

JVM의 메모리로 런타임에 발생하는 데이터들이 여기에 저장이된다. Method Area와 Heap Area는 모든 스레드에서 공유되지만, Stack Area, PC Register, Native Method Stack 각각의 스레드에 생성되고 공유되지 않는다.

Method Area

  • Static Area라고도 한다.
  • Class Loader로부터 읽어온 데이터를 클래스와 인터페이스 별로 상수풀, 필드 데이터, 메소드 데이터, 메소드 코드 등에 대한 정보를 분류해서 저장 (클래스와 인터페이스 수준의 클래스 정보를 말함 - 클래스 이름, 부모 클래스 이름, 메소드, 변수) -> 공유 자원이다.
  • Runtime Constant Pool이 Method Area 안에 포함된다.
    • 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 레퍼런스 저장
    • JVM은 Runtime Constant Pool을 통해 해당 메소드나 필드의 실제 메모리 상 주소를 찾아 참조한다.

Heap Area

  • 데이터들이 런타임 시에 동적으로 할당되는 영역
  • 객체의 정보들이 저장됨
  • 힙 안에도 여러개의 영역으로 나눠진다.
    • Eden : 최초 객체 생성 지역. 가득 차면 GC에 의해 사용되지 않는 객체 삭제
    • Survivor 0 : Eden에서 삭제되고 남은 객체들을 옮겨와 이곳에 저장
    • Survivor 1 : Survivor 0에서 가득차서 삭제되고 이동된 객체 저장
    • Old : Old에서도 가득차면 Full GC가 발생해 모든 스레드를 정지시키고 메모리를 재구성한다.
    • Old 이전에 발생하는 메모리 정리를 minor GC, Old에서 발생하는 메모리 정리를 major GC라고 한다.
    • Permanent : JDK 8버전부터는 Native Method Stack으로 이동

Stack Area

  • 각 스레드마다 존재하는 영역으로 메소드의 정보, 지역변수, 매개변수, 메서드 동작중 발생하는 임시 데이터 등이 저장된다.

PC Register

  • Thread 내에 현재 실행할 Stack Frame을 가리키는 포인터 정보가 들어있다.
  • Stack Frame에는 명령 정보가 들어있다.

Native Method Stack

  • 자바 외의 언어로 작성된 네이티브 코드를 위한 Stack
  • Native Method의 매개변수,지역 변수 등을 저장
  • C, C++ 등의 언어로 작성된 함수를 사용할 수 있는 JNI(Java Native Interface)제공

 


참고 사이트

 

JVM. 클래스로더 서브시스템(Class Loader Subsystem)

JVM은 RAM에 위치하며, 실행 중에 클래스로더 서브시스템을 이용하여 클래스 파일을 RAM으로 가져옵니다. 이를 자바의 동적 클래스 로딩 기능이라고 합니다. 이 과정은 컴파일 타임이 아니라 런타

blog.hexabrain.net

 

 

JVM 구조와 자바 런타임 메모리 구조 (자바 애플리케이션이 실행될 때 JVM에서 일어나는 일, 과정

JVM(Java Virtual Machine) : 자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체다. CPU나 운영체제(플랫폼)의 종류와 무관하게 실행이 가능하다. 즉, 운영체제 위에서 동작하는 프로세스로 자

jeong-pro.tistory.com

 

 

자바(Java) 메모리 구조 / Runtime Data Area

자바의 메모리 구조 우리가 작성한 소스 코드는 컴파일해 자바 바이트 코드로 바꾸고 이를 JVM으로 실행하게 된다. 그리고 이 과정에서 코드들은 Runtime Data Area 영역에서 실행된다. 즉 OS가 JVM에

sgcomputer.tistory.com

 

 

JVM은 꼭 알아야 합니다...

경험있고 깊이있는 개발자라면 코드를 짤 때 어플리케이션의 성능과 안정성 등을 고려할 것이지만, 부끄럽게도 나는 어플리케이션의 성능과 안정성보다는 로직의 구현 자체에 더 신경을 써온

velog.io

 

 

JVM 메모리 구조와 Garbage Collector

JVM이란?

2ssue.github.io

 

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

JAVA의 리플렉션 API  (0) 2023.01.08
[JAVA] String 그리고 StringBuffer와 StringBuilder  (0) 2022.08.30
Abstract Class와 Interface  (0) 2022.08.23
Java에서의 Hash  (0) 2022.08.16
정적 팩토리 메서드(Static Factory Method)  (0) 2022.07.31