Study · JDK · STEP 4 / 8 · 실행할 때

java는 JVM이 아니다 — 작은 런처가 JVM을 세우고 main을 부탁한다

장면

터미널에 java Hello를 쳤다. Hello.main의 첫 줄이 돌고 화면에 Hello, JDK가 찍히기까지 JDK 안에서는 누가 어떤 순서로 일할까?

아래 재생기의 ▶를 누르면 한 스텝씩 진행된다. 금색 테두리가 지금 이야기하는 곳이고, 캡션이 무슨 일이 일어났는지 말해 준다. 굵게 밑줄 친 말은 누르면 뜻이 나온다. 빨간 딱지는 그때 벌어지는 일의 이름이고, 캡션 바로 위 회색 글자는 지금 스텝이 속한 묶음의 이름이다.

카드 아래 회색 줄은 그 일이 실제로 적혀 있는 소스의 파일 이름 : 줄 번호와 함수 이름이다. 글 안에 (:669)처럼 줄 번호만 적힌 것은 바로 앞에 적은 파일의 그 줄이라는 뜻이다. 캡션 한가운데 박힌 긴 영어 이름과 괄호 속 파일 · 줄 번호도 같다 — 건너뛰고 한글만 읽어도 뜻이 통하게 써 두었다.

장면 · java Hello를 친 순간 0 / 22

터미널에 java Hello를 쳤다. ▶를 누르면 런처 · JVM · JDK의 Java 코드 · 내 코드 네 칸 사이를 22스텝으로 따라간다.

키보드 · ← → 한 스텝 · Space 재생/멈춤 · Home 처음

내 Hello는 22스텝 중 스텝 13에서야 등장하고, 화면에 글자를 내는 건 스텝 20의 시스템 콜이다. 그 전에 JVM은 객체가 들어갈 힙, 바이트코드를 실행할 인터프리터, String · System.out 같은 기본 객체, 모듈, 클래스 로더를 먼저 세운다.

어떻게 확인했나

소스 어디를 보고 적었는지와 무엇을 돌려서 쟀는지를 남긴 자리다. 처음 읽을 때는 건너뛰어도 된다.

  • 1–17 · 21–22스텝의 줄 번호는 저장소의 JDK 27 소스를 grep · sed로 한 줄씩 확인했다.
  • 18–20스텝(println → 128바이트 버퍼 → autoFlush → writeBytes)은 이 컴퓨터 JDK 21.0.9 의 src.zip 에서 PrintStream · System · FileOutputStream 줄 번호를 확인했다 — 다른 스텝의 JDK 27 소스와 버전이 다르다. writeBytes 의 C 쪽과 터미널 앱이 글자를 그리는 과정은 열어 보지 않았다.
  • 재생기 위 세계관 그림의 칸(도서관 · 책갈피 · 작업대 · 도시 지침서)은 /roadmap/world 의 세계관을 그대로 쓴다.
  • 흔히 쓰는 public static void main(String[] args) 모양만 따라갔다. 최근 JDK는 static이 아니거나 인자가 없는 main도 받아서, 런처 안에 그 갈래가 따로 있다.