우리가 이때까지 JVM의 요소로써 큰 기능들에 대해서 다 알아봤다. 그러면 이제 다시 초심으로 돌아가서 "그래서 자바를 실행하면 어떻게 되는데요?" 라는 질문에 정리하여 답할 시간이 되었다.
- Method Area: 클래스와 관련된 정보를 저장한다.
- Heap Area: 객체와 관련된 정보들에 대해 저장한다.
- Stack Area: 메서드 내의 관련된 정보들에 대해 저장한다.(지역안에 존재하는 변수들 등등..)
- PC Register: Thread(쓰레드)가 생성될 때마다 생성되는 영역, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다. 이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있게 한다.
- Native Method Area: JAVA가 아닌 다른 언어에 대한 정보를 저장한다.
이때 실행 방식에는 2 가지 방식을 혼합하여 사용을 한다.
- Interpreter: 바이트코드를 한 줄씩 해석, 실행하는 방식이다. 초기 방식으로, 속도가 느리다는 단점이 있다.
- JIT(Just In Time): 그래서 나온 것이 JIT(Just In Time) 컴파일 방식이다. 바이트코드를 JIT 컴파일러를 이용해 프로그램을 실제 실행하는 시점(바이트코드를 실행하는 시점)에 각 OS에 맞는 Native Code로 변환하여 실행 속도를 개선하였다.
그러나, 바이트코드를 Native Code로 변환하는 데에도 비용이 소요되므로, JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다 일정 기준이 넘어가면 JIT 컴파일 방식으로 명령어를 실행한다.
그런데! Java에서는 메모리를 관리해주는 모듈인 JVM의 Garbage Collector라는 것이 동작하는데 더 이상 참조되지 않은 객체들을 자동으로 제거를 한다. 주로 Heap 영역에서 일어나게 되는데 5가지의 영역이 또 나뉘어진다.
더 자세하게 살펴보기 위하여서는 이전 시리즈에서 작성하였던 JVM의 기능에 따라 정리한 글과 밑에 출처들을 참고하시면 좋을 거 같습니다.
JDK, JRE, JVM
Class Loader
Execution Engine
Run Time Data Area
Garbage Collector
실제로 조사해보면서 알게 된 것이 정리해놓은 글보다 더 많은 글 더 많은 자료들이 많았다. 그것에 대하여서는 계속해서 수정하고 글들을 보완해나가는 것이 중요할 것 같다.
Java가 어떻게 하면 진행이 될까? 라는 질문에 대해서 너무 많은 글들을 많이 봐서 단순히 중요하구나... 라는 생각을 가지고 이 시리즈를 시작했었다. 이것에 대한 질문에 대해서는 아주 자세하게 들어가면 끝도 없이 들어갈 수 있다는 것을 자료들을 조사해보면서 많이 깨닫게 되었다. 그래도 일단 어떻게 진행이 되는지는 큰 그림은 알고 가게 되어서 다행이라고 생각하는데, Java를 사용하려고 하면서 가장 중요한 기본을 이제라도 알고 가서 참 다행인 거 같다. 앞으로도 다른 언어나 기술들에 대해서 공부하려고 할 때 자신의 언어로 정리하고 설명하듯이 글 쓰는 습관을 가져보는 것도 나쁘진 않을 거 같다는 것을 많이 느낀다.