[Java를 실행하면 어떻게 진행이 되나요?] 최종: 그래서 자바를 실행하면 어떻게 되는데요?

khyojun·2022년 12월 2일
2
post-thumbnail

🔍 Java 실행 과정

📌 이제 큰 요소들은 다 알아봤다.

  • ✔ Class Loader
  • ✔ Execution Engine
  • ✔ Runtime Data Area
  • ✔ Garbage Collector

🏸 이제 생각할 것...

우리가 이때까지 JVM의 요소로써 큰 기능들에 대해서 다 알아봤다. 그러면 이제 다시 초심으로 돌아가서 "그래서 자바를 실행하면 어떻게 되는데요?" 라는 질문에 정리하여 답할 시간이 되었다.

📕 자바를 실행하면?

1. Java Source 파일을 실행시키면 JAVAC으로 인하여서 .class 파일(바이트코드)의 형태로 변한다.

2. .class의 파일을 이제 Class Loader로 넘긴 후 Class Loader가 이제 JVM의 메모리 영역(run time date area)에 적재시킨다.

3. 적재시키는 과정 속 JVM의 메모리 영역은 5가지의 형태로 구분이 되어져있는데 다음과 같이 적재를 시킨다.

  • Method Area: 클래스와 관련된 정보를 저장한다.
  • Heap Area: 객체와 관련된 정보들에 대해 저장한다.
  • Stack Area: 메서드 내의 관련된 정보들에 대해 저장한다.(지역안에 존재하는 변수들 등등..)
  • PC Register: Thread(쓰레드)가 생성될 때마다 생성되는 영역, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다. 이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있게 한다.
  • Native Method Area: JAVA가 아닌 다른 언어에 대한 정보를 저장한다.

4. JVM은 Method Area의 바이트 코드를 Execution Engine에 제공하여, Class에 정의된 내용대로 바이트 코드를 실행시킨다.

이때 실행 방식에는 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가지의 영역이 또 나뉘어진다.

  • Minor GC: 앞의 3 부분 New로 인하여 새로 생성된 부분에서 일어나는 Garbage Collector를 의미한다.
    • Eden이 가득찼을 때 실행
    • 속도가 빠름
  • Major GC: 뒤쪽의 Old 부분부터 일어나게 되는 Garbage Collector를 의미한다.
    • Old가 가득찼을 때 실행
    • 속도가 느림

간단하게 설명하면 이렇게 설명이 됩니다.

더 자세하게 살펴보기 위하여서는 이전 시리즈에서 작성하였던 JVM의 기능에 따라 정리한 글과 밑에 출처들을 참고하시면 좋을 거 같습니다.

JDK, JRE, JVM
Class Loader
Execution Engine
Run Time Data Area
Garbage Collector

😲 여기서 끝인가?

실제로 조사해보면서 알게 된 것이 정리해놓은 글보다 더 많은 글 더 많은 자료들이 많았다. 그것에 대하여서는 계속해서 수정하고 글들을 보완해나가는 것이 중요할 것 같다.

👍 해보면서 느낀 것

Java가 어떻게 하면 진행이 될까? 라는 질문에 대해서 너무 많은 글들을 많이 봐서 단순히 중요하구나... 라는 생각을 가지고 이 시리즈를 시작했었다. 이것에 대한 질문에 대해서는 아주 자세하게 들어가면 끝도 없이 들어갈 수 있다는 것을 자료들을 조사해보면서 많이 깨닫게 되었다. 그래도 일단 어떻게 진행이 되는지는 큰 그림은 알고 가게 되어서 다행이라고 생각하는데, Java를 사용하려고 하면서 가장 중요한 기본을 이제라도 알고 가서 참 다행인 거 같다. 앞으로도 다른 언어나 기술들에 대해서 공부하려고 할 때 자신의 언어로 정리하고 설명하듯이 글 쓰는 습관을 가져보는 것도 나쁘진 않을 거 같다는 것을 많이 느낀다.

출처

profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

0개의 댓글