javac
와 같은 컴파일러를 통해서 바이트 코드(.class
)로 변환Java코드는 이러한 과정을 통해서 실행이 되게 된다. 여기서 JVM의 동작 방식은 꽤 복잡한데, 이번 글에서는 이 JVM의 동작 방식에 대해서 알아보도록 하겠다.
JVM의 구조는 이렇게 생겼고, 간략한 동작방식은 아래와 같다.
위 과정에 대해서 좀 더 자세히 알아보도록 하자.
Runtime Data Area는 데이터를 효율적으로 분류하고 관리하는 역할을 한다.
static 변수, final 클래스등등이 관리되는 영역이다.
인스턴스들이 보관되는 영역이다.
GC 스캐닝 대상이 되는 영역이기도 하다.
지역 변수, 파라미터, 리턴 값등등의 임시 값을 관리하는 영역이다.
쓰레드를 관리하는 영역이다
Java 이외의 언어로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역이다.
실질적인 코드의 실행을 담당하는 영역이다. 엔진의 구성 요소는 아래와 같다.
바이트 코드를 OS에 맞는 네이티브 코드로 변환하지 않고, 바로 실행하는 역할을 한다.
바이트 코드를 OS에 맞는 네이티브 코드로 변환하여 실행한다.
📌 바이트 코드의 실행은 Interpreter와 JIT Compiler의 혼합으로 실행된다. 기본적으로 Interpreter로 실행이 되다가, 임계치를 넘어가면 JIT Compiler도 같이 바이트 코드 실행을 하게 된다.
Heap 영역에 올라가 있는, 더 이상 사용되지 않는 인스턴스들을 메모리에서 해제하는 기능을 수행한다. 더 이상 사용되지 않는 인스턴스를 판단하는 기준은 어떤 인스턴스가 실행중인 쓰레드에 링크되어 있는지 아닌지이다.
이번 글에서는 Java의 전반적인 동작 방식에 대해서 알아보았다.
뭐 사실 깊게 파면 한도 끝도 없이 파야해서, 전반적인 흐름을 알 수 있도록 정리해보았다.
맨날 공부해도 헷갈릴 때가 많아서 한번 정리해보았고, 다른 분들한테도 도움이 되길 바란다. 🙏