개발 일지/Java

[JAVA] JVM 구조와 JAVA의 동작 원리

배발자 2022. 1. 16.
반응형

 

 

오늘은 JVM 구조와 동작 원리에 대해서 살펴보고자 한다. 

 

 

 

JVM 구조

 

 

 

 

 

JVM 구조는 크게 클래스 로더(Class Loader), 런타임 데이터 영역(Runtime Data Area), 실행 엔진(Execution Engine), 그리고 가비지 컬렉터(Garbage Collector)로 구성된다. 

 

가비지 컬렉터는 이번 포스팅에서 다루기 복잡하기 때문에 추후 포스팅 하도록 하겠다. 

 

1. 클래스 로더

 

클래스 로더는 JVM 내에서 자바 클래스 파일을 로딩하는 역할을 한다. JVM은 클래스 로더를 통해 필요한 클래스 파일들을 찾아 런타임 데이터 영역에 저장하게 된다. 클래스 로더는 로딩, 링크, 초기화 과정을 거치며, 클래스 파일의 검증 작업도 수행한다. 

 

2. 런타임 데이터 영역

 

런타임 데이터 영역은 JVM 내에서 메모리를 할당하여 자바 애플리케이션을 실행하는 공간이다. 런타임 데이터 영역은 다시 메서드 영역, 힙 영역, 스택 영역으로 구성된다.

  • 메서드 영역(Method Area) : JVM은 클래스 로더를 통해 읽어들인 클래스 파일들을 분석하여 클래스, 인터페이스, 필드, 메소드 등의 정보를 저장하는 공간이다. JVM은 메서드 영역에 있는 정보들을 이용하여 클래스 인스턴스를 생성하고, 메소드를 호출하게 된다.
  • 힙 영역(Heap Area) : 힙 영역은 JVM이 동적으로 할당하는 메모리 공간으로, 객체들이 생성되는 공간이다. 힙 영역은 GC에 의해 관리되며, 더 이상 참조되지 않는 객체들은 GC에 의해 제거된다.
  • 스택 영역(Stack Area) : 스택 영역은 메소드의 호출과 관련된 정보를 저장하는 공간이다. 스택 영역은 스레드마다 별도로 할당되며, 메소드 호출 시 매개변수, 지역변수, 리턴값 등이 저장되며, 메소드 호출이 완료되면 해당 공간은 해제된다.
  • PC Register : PC Register 는 현재 실행 중인 명령어 주소를 저장하는 레지스터로, 각 스레드마다 별도로 할당되며, 스레드가 생성될 때마다 초기화된다.
  • Native Method : Native Method는 자바 프로그램에서 C/C++ 등의 외부 언어로 작성된 메소드를 의미하며, 자바에서 실행되는 코드와는 달리, 운영체제나 하드웨어와 같은 외부 자원에 직접 접근할 수 있다.

3. 실행 엔진

 

실행 엔진은 런타임 데이터 영역에 저장된 바이트 코드를 기계어로 번역하여 실행하는 역할을 한다. 실행 엔진은 크게 인터프리터(Interpreter), JIT 컴파일러(JIT Compiler), 그리고 네이티브 메소드 라이브러리(Native Method Libraries)로 구성된다.

  • 인터프리터 : 바이트 코드를 한 줄씩 읽어서 해석하고, 실행하는 역할을 한다. 인터프리터는 빠르게 실행이 가능하지만, 반복적인 실행에서는 성능상 이슈가 있다.
  • JIT 컴파일러 : 인터프리터의 성능 문제를 해결하기 위해 등장한 기술이다. 실행 중에 인터프리터가 자주 실행되는 부분을 찾아 미리 기계어로 변환하여 캐시에 저장한다. 이후에 해당 부분이 다시 실행될 때, JIT 컴파일러에서 미리 변환한 기계어를 실행하여 성능 향상을 이루어낸다.

 

JAVA 동작 원리

 

1. 작성한 자바소스를 컴파일러에게 전달하면, 컴파일러는 해당 소스코드를 분석하여 바이트 코드(Bytecode)로 변환한다. 바이트 코드는 플랫폼 독립적인 이진 파일로, JVM에서 실행될 수 있는 명령어들의 집합이다. 

 

2. 클래스 로더는 컴파일된 바이트 코드를 JVM에 로딩한다. 클래스 로더는 클래스 파일을 읽어들이고, 해당 클래스의 정보를 메모리에 로드하여 클래스들 간의 의존성을 관리한다.

 

3. 로딩된 클래스 파일은 런타임 데이터 영역(Runtime Data Area)에 저장된다. 런타임 데이터 영역은 크게 메서드 영역(Method Area), 힙 영역(Heap Area), 스택 영역(Stack Area)으로 구성되며, 각각의 영역은 다른 목적으로 사용된다.

 

4. 실행엔진은 로딩된 클래스 파일을 JVM의 런타임 데이터 영역에 저장된 명령어들로 해석하여 실행한다. 

 

자바 바이트 코드(Java bytecode)란 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다. 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불리고 있다. 이러한 자바 바이트 코드의 확장자는 .class이다. 자바 바이트 코드는 자바 가상 머신만 설치되어 있으면, 어떤 운영체제에서라도 실행될 수 있다.

 

반응형

'개발 일지 > Java' 카테고리의 다른 글

[Java] 해시 충돌  (0) 2022.12.19
[Java] equals 와 hashCode  (0) 2022.12.18
[Java] public static void main 인 이유?  (0) 2022.12.18
[Java] Java 8 / Java 11 버전 별 특징  (0) 2022.12.17
[Java] ArrayList 동작원리  (0) 2022.12.17

댓글