Develop/Java

[Java] JVM 구조 및 동작원리 - 1

순무엄마동생 2023. 1. 3. 12:30

지난번 String Pool 관련하여 작성하면서 JVM 구조와 동작원리에 대해서 궁금해서 조금 찾아본 내용을 글로 줍줍..인데 제목이 1인 이유는 깊게 봐야할 내용이 많아서 이해한 내용 먼저 작성하고 추가적으로 버전 2, 3 .... 을 만들 예정이기 떄문이다. 

(혹시 틀리거나 모호한 부분, 궁금한 부분이 있다면 댓글 남겨주세요😃)

 

JVM(Java Virtual Machine)

 

JVM이란 Java 언어로 개발한 프로그램을 컴파일하여 바이트코드로 실행시키기 위한 가상머신이다.

왼쪽 그림과 같이 운영체제와 Java Application 사이에 존재하며 개발자가 작성한 Java 코드를 기계어로 번역하는 역할을 한다. 그렇게 때문에 운영체제와 상관없이 JVM 실행 가능한 환경이라면 어디서든 Java 프로그램 실행이 가능하다는 장점이 있다. 반면, JVM라는 단계를 하나 더 거치기 때문에 속도적인 측면에서는 C, C++보다 느리다는 단점이 있다. 속도가 굉장히 중요한 곳에서는 C를 사용해야한다.

현재 나는 증권쪽에서 일하고 있는데 이러한 이유로 단순 조회, 처리성은 Java의 코드로 작성되며 실시간 주문과 관련된 코드에는 C를 사용하고 있다!

 

JVM 구조

위키피디아에서 발췌한 JVM 구조도이다.

크게 3가지 클래스로더(Class Loader), 실행엔진(Execution Engine), JVM Memory(Runtime Data Area)로 나눠서 볼 예정이다.

JVM 구조

클래스로더(Class Loader)

말 그대로 클래스 파일을 읽어와서 메모리에 로드하는 역할을 한다.

java로 작성한 코드는 컴파일되어 class파일로 변환된다. 클래스로더는 변환된 class파일로부터 클래스의 바이너리 데이터가 유효한지 확인하고 각 변수 및 메소드들을 적절한 메모리에 할당, 마지막엔 초기화하는 작업을 한다.

 

JVM Memory

메모리 영역은 실행 데이터 영역(Runtime Data Area)라고도 부른다. 크게 5가지 영역으로 구분되는데 메소드 영역, 힙, 스택, PC 레지스터, Native 메소드 스택이 있다. 메소드, 힙은 스레드가 공유하며 그 외에는 스레드별로 영역을 가지고 있다. 

 

  • 메소드 영역(Method Area) : 클래스명, 메소드, 변수 등 클래스 수준의 데이터가 저장된다.
  • 힙 영역(Heap Area) : 객체와 배열이 저장되는 공간이다. GC의 대상이 된다.
  • 스택 영역(Stack Area) : 지역 변수가 저장된다.
  • PC Register : 스레드별로 존재하며 스레드가 현재 실행중인 위치(주소값)를 저장한다. 
  • Native Method Stacks : 네이티브 코드를 위한 메모리 영역이다. 

 

실행 엔진(Execution Engine)

클래스 로더에 의해 메모리에 적재된 바이트코드들을 기계어로 변경하여 명령어 단위로 실행한다.

한마디로 메모리에 적재된 내용을 기반으로 프로그램 실행시키는 역할이다.

 

 

내가 이해한 흐름도 💡

1. 개발자가 java 코드를 작성한다.

2. 개발자가 실행을 하면 java가 컴파일되며 class 파일로 변환된다.

3. JVM의 클래스 로더에 의해 동적으로 메모리에 코드들이 적재된다.

4. JVM Memory에 적재된 내용을 기반으로 실행 엔진에 의해 프로그램이 실행된다.

 

이 흐름도는 내가 이해한 기반이라서 정확하지 않을 수 있다!

클래스 로더 내부나 실행 엔진 동작 방식 인터프리터, JIT 컴파일러는 나중에 좀 더 자세히 다루고 링크 첨부해야겠다. 요 글은 간단하게만 남기는 걸루!

'Develop > Java' 카테고리의 다른 글

[Java] 스트링풀(String Pool)  (0) 2022.12.31
[Java/디자인패턴]Singleton/싱글톤  (0) 2021.01.22