Java의 동작 방식과 JVM의 메모리 구조 (Simple version)

Kai·2023년 12월 31일
0

Java

목록 보기
1/16

💡 Java의 동작 방식


  1. Java로 코드 작성 (.java)
  2. javac와 같은 컴파일러를 통해서 바이트 코드(.class)로 변환
  3. Class Loader에 의해서 JVM에 코드가 올라가고 실행됨

Java코드는 이러한 과정을 통해서 실행이 되게 된다. 여기서 JVM의 동작 방식은 꽤 복잡한데, 이번 글에서는 이 JVM의 동작 방식에 대해서 알아보도록 하겠다.


💡 JVM의 동작 방식


JVM의 구조는 이렇게 생겼고, 간략한 동작방식은 아래와 같다.

  1. Class Loader에 의해서 바이트 코드를 Runtime Data Area(메모리 영역)에 올림
  2. Runtime Data Area에 올라온 바이트 코드를 Execution Engine을 통해 해석하고 실행함

위 과정에 대해서 좀 더 자세히 알아보도록 하자.

1. Runtime Data Area

Runtime Data Area는 데이터를 효율적으로 분류하고 관리하는 역할을 한다.

1-1) Class Method Area

static 변수, final 클래스등등이 관리되는 영역이다.

1-2) Heap

인스턴스들이 보관되는 영역이다.
GC 스캐닝 대상이 되는 영역이기도 하다.

1-3) Stack

지역 변수, 파라미터, 리턴 값등등의 임시 값을 관리하는 영역이다.

1-4) PC Register

쓰레드를 관리하는 영역이다

1-5) Native Method stack

Java 이외의 언어로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역이다.


2. Execution Engine

실질적인 코드의 실행을 담당하는 영역이다. 엔진의 구성 요소는 아래와 같다.

2-1) Interpreter

바이트 코드를 OS에 맞는 네이티브 코드로 변환하지 않고, 바로 실행하는 역할을 한다.

2-2) JIT Compiler

바이트 코드를 OS에 맞는 네이티브 코드로 변환하여 실행한다.

📌 바이트 코드의 실행은 Interpreter와 JIT Compiler의 혼합으로 실행된다. 기본적으로 Interpreter로 실행이 되다가, 임계치를 넘어가면 JIT Compiler도 같이 바이트 코드 실행을 하게 된다.

2-3) Garbage Collector

Heap 영역에 올라가 있는, 더 이상 사용되지 않는 인스턴스들을 메모리에서 해제하는 기능을 수행한다. 더 이상 사용되지 않는 인스턴스를 판단하는 기준은 어떤 인스턴스가 실행중인 쓰레드에 링크되어 있는지 아닌지이다.


☕ 마무리


이번 글에서는 Java의 전반적인 동작 방식에 대해서 알아보았다.
뭐 사실 깊게 파면 한도 끝도 없이 파야해서, 전반적인 흐름을 알 수 있도록 정리해보았다.

맨날 공부해도 헷갈릴 때가 많아서 한번 정리해보았고, 다른 분들한테도 도움이 되길 바란다. 🙏


🙏 참고


0개의 댓글