본문 바로가기
프로그래밍/Java

[Java] JVM의 구조

by 시간많은백수 2023. 10. 5.
반응형

💡JVM의 동작방식

 

[Java] 컴파일 과정

✔️컴파일이란? 프로그래밍 언어로 작성한 코드는 사람이 이해하고 작성하기 편리한 형태입니다. 그러나 컴퓨터는 이러한 코드를 직접 실행할 수 없습니다. 여기에서 컴파일러가 등장합니다.

richwish.tistory.com

  1. 자바로 개발된 프로그램을 실행하면 JVM은 OS에 메모리를 할당합니다.
  2. 자바컴파일러(javac)가 자바파일(.java)을 바이트코드(.class)로 컴파일 합니다.
  3. ClassLoader를 통해서 바이트코드를 JVM Runtime Data Area로 로딩합니다.
  4. Runtime Data Area에 있는 바이트코드들은 Excution Engine을 통해 해석됩니다.
  5. 해석된 바이트코드는 Runtime Data Area의 각 영역에 배치되어 수행하며 이 과정에서 Excution Engine에 의해 GC동작과 스레드 동기화가 이루어집니다.

📌클래스 로더 (Class Loader)

JVM의 시작 단계에서 클래스 로더가 클래스 파일들을 로드하고 메모리에 올립니다. 클래스 로더는 세 가지 주요 부분으로 나뉩니다.

  • Bootstrap Class Loader: Java의 기본 클래스들을 로드합니다.
  • Extension Class Loader: Java의 확장 클래스들을 로드합니다.
  • Application Class Loader: 애플리케이션 클래스들을 로드합니다.

 

📌실행엔진 (Excution Engine)

 

실행 엔진은 바이트 코드를 실제로 실행하는 역할을 합니다. 실행 엔진은 크게 두 부분으로 나뉩니다.

  • Interpreter (인터프리터): 바이트 코드를 한 줄씩 해석하고 실행합니다.
  • Just-In-Time Compiler (JIT 컴파일러): 바이트 코드를 머신 코드로 직접 번역하고 실행합니다. 이렇게 컴파일된 코드는 더 빠르게 실행됩니다.

 

📌가비지 콜렉터 (Garbage Collector)

가비지 컬렉터는 더 이상 참조되지 않는 객체를 수거하고 메모리를 회수합니다. Java 프로그래머는 메모리 관리를 수동으로 처리할 필요가 없습니다. Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거하는 역할을 하며 해당 역할을 하는 시간은 정확히 언제인지를 알 수 없습니다. GC역할을 수행하는 스레드를 제외한 나머지 모든 스레드들은 일시정지상태가 됩니다.

 

📌런타임 데이터 영역 (Runtime Data Area)

JVM은 데이터 저장을 위한 다양한 런타임 데이터 영역을 갖고 있습니다.

  • Method Area (메서드 영역): 클래스 멤버(필드, 메서드)의 정보와 정적 변수가 저장되는 곳입니다.
  • Heap (힙): 동적으로 생성된 객체와 배열이 저장되는 곳으로, 가비지 컬렉션의 대상입니다.
  • Stack (스택): 메서드 호출과 관련된 로컬 변수, 메서드 호출 스택 등이 저장되는 곳입니다.
  • PC Register (프로그램 카운터 레지스터): 현재 실행 중인 스레드의 주소를 저장합니다.
  • Native Method Stack (네이티브 메서드 스택): 네이티브 코드(Java 외부의 코드) 호출과 관련된 스택입니다.

 

참고 https://coding-factory.tistory.com/828

반응형