Java

JVM 내부구조와 동작원리

slown 2024. 5. 2. 16:26

 

JVM ?

jvm은 Java Virtual Machine으로 컴퓨터가 자바 프로그램을 실행할 수 있도록 도와주는 가상머신이다. jvm을 사용하게 되면  OS가 다 달라도 JVM 버전이 OS마다 있기 때문에 JVM은 OS에 의존적이지만 자바 파일은 OS에 의존적이지 않고 JVM에서 실행될 수 있습니다.

 

아래의 사진은 JVM의 구조입니다.

 

Jvm의 구조를 보면 Garbage Collector, Execution Engine, Class Loader, Runtime Data Area로 나눠질 수 있습니다.

 

Class Loader

 

Jvm 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다. 런타임 시에 동적으로 클래스를 로드한다.

 

Execution Engine

 

클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행한다. 최초 JVM이

나왔을 당시에는 인터프리터 방식이었기 때문에 속도가 느리다는 단점이 있었지만, JIT 컴파일러 방식을 통해서 속도가 느린점을 보완하였다. JIT는 바이트 코드를 어셈블러 같은 네이티브 코드로 바꿈으로써 실행이 빠르지만 역시 변환하는데 비용이 발생한다. 이 같은 이유로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT컴파일러 방식으로 실행한다.

 

Garbage Collector

 

Garbage Collector는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다.

 

Runtime Data Area

 

Runtime Data Area는 JVM이 프로그램을 싱행하기 위해 OS별로 저장하는 공간입니다.

 

Runtime Data Area는 크게는 2가지로 볼 수 있다.

  • PC Register , JVM stack , Native Method stack은 Tread별로 생성
  • Heap , Method Area 모든 Thread가 공유한다.

 

4.1. Method area 

모든 쓰레드가 공유하는 메모리 영역. 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관한다.

 

4.2. Heap area

모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역. 또한, 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.

 

4.3. Stack area 

메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성한다. 그리고 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다. 마지막으로, 메서드 수행이 끝나면 프레임별로 삭제한다.

 

4.4. PC Register

쓰레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재한다. 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖는다.

 

 

4.5. Native method stack

자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역.

 

참고 

https://velog.io/@dkwktm45/Java-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC-%EB%B0%8F-%EA%B0%9C%EB%85%90#jvm-%EA%B5%AC%EC%A1%B0%EC%99%80-%EB%8F%99%EC%9E%91

 

Java 동작원리 및 개념

Java를 공부한다면 아마도 가장먼저 짚고 넘어가는 개념이지 않을까 싶다. 그렇기에 나 또한 정리를 해나갈려고 한다. 이미 정말 좋은 글들이 많지만 필자는 정리를 함으로서 내 것으로 만들어

velog.io

https://llshl.tistory.com/10