← 전체 프로젝트

웹앱, 2026

JVM Visualizer

브라우저에서 돌아가는 교육용 자바 가상 머신입니다. 컴파일된 바이트코드를 명령어 하나씩 실행하면서 스택, 힙, 스레드가 어떻게 바뀌는지 볼 수 있습니다.

  • java
  • jvm
  • rust
  • webassembly
앱 실행하기 →앱 화면은 영어로 되어 있습니다.

1995년 5월 23일, 썬 마이크로시스템즈가 샌프란시스코의 SunWorld 행사에서 자바를 발표했습니다. 제임스 고슬링의 팀이 1991년부터 만들어 온 언어였고, 처음 이름은 오크(Oak)였습니다. 자바 컴파일러가 만드는 것은 바이트코드입니다. CPU가 무엇이든, 그 위에서 도는 자바 가상 머신(JVM)이 바이트코드를 한 명령어씩 읽어 실행합니다.

바이트코드를 담은 .class 파일은 모두 같은 네 바이트, CA FE BA BE로 시작합니다. 고슬링의 회고에 따르면, 그와 동료들이 점심을 먹던 팰로앨토의 한 식당을 단골들은 ’Cafe Dead’라고 불렀고, 누군가 그 이름이 16진수로 읽힌다는 것을 알아챘습니다. 그는 객체 파일 형식에 CAFEDEAD를 쓰고, 클래스 파일에는 짝을 맞춰 CAFEBABE를 붙였습니다.

CA FE BA BE 뒤로는 상수 풀과 필드, 메서드가 차례로 이어지고, 메서드마다 바이트코드가 들어 있습니다. JVM이 이 바이트코드를 한 명령어씩 실행하는 동안, 지역 변수는 어디에 저장될까요? new를 실행하면 힙에는 실제로 무엇이 생길까요? 예외가 메서드 세 개를 거슬러 올라가는 동안 호출 스택에서는 무슨 일이 벌어질까요? JVM은 이런 질문에 초당 수백만 번씩, 아무 말 없이 답하고 있습니다. JVM Visualizer는 그 과정을 명령어 하나 단위로 늦춰서 보여 줍니다.

그 안에서는 Rust로 작성해 WebAssembly로 컴파일한 실제 바이트코드 인터프리터가 돌아갑니다. .class 파일이나 .jar를 불러오거나 내장 샘플을 골라 한 단계씩 실행해 보세요. .java 소스를 함께 넣으면 소스 화면이 지금 실행 중인 줄을 따라갑니다. 샘플은 javac --release 17로 컴파일했고, JDK에서 실행한 것과 바이트 하나까지 같은 결과를 출력합니다.

메모리 모드: 레지스터가 현재 프레임을 가리키고, 참조는 힙으로 향하는 화살표로 표시된다

무엇을 볼 수 있나요

  • 스레드 스택과 프레임. 프레임마다 지역 변수와 피연산자 스택을 보여 줍니다. 다음에 실행할 명령어가 무슨 일을 하는지, 스택에서 무엇을 꺼내고 넣는지, 실제로 어떤 값을 쓰는지도 풀어서 설명합니다.
  • 메모리 모드. JVM의 런타임 데이터 영역을 그림 한 장에 담았습니다. 교과서에 나오는 네 레지스터(pc, optop, frame, vars)와 JVM 스택, 메서드 영역, 힙이 한눈에 들어옵니다. 참조는 모두 화살표로 그려집니다. 클래스는 로드되기 전부터 메서드 영역에 자리 잡고 있어서, 처음 쓰이는 순간 로드되는 모습을 지켜볼 수 있습니다.
  • 예외. 예외를 던진 프레임이 강조되고, 예외 객체는 힙에 고정됩니다. 스택이 풀리면서 빠져나가는 프레임도 하나하나 기록됩니다.
  • 스레드와 락. 결정적 스케줄러, 모니터, wait/notify, 교착 상태 감지를 지원합니다. 어떤 락을 누가 쥐고 있고 누가 기다리는지 모두 보여 줍니다.

예외가 호출 스택을 거슬러 올라가는 모습: 예외를 던진 프레임이 강조되고 예외 객체가 힙에 고정된다

두 작업 스레드가 같은 락을 두고 다투는 모습

지원 범위

Java SE 17 JVM 명세의 일부를 구현했습니다. 더 이상 쓰이지 않는 jsr/ret을 뺀 모든 명령어와 클래스, 인터페이스, 배열, 클래스 초기화, synchronized, 예외, 문자열 연결과 람다에 쓰이는 invokedynamic, 스레드를 지원합니다. 런타임 라이브러리는 이 VM을 위해 따로 작성했으며 String, 래퍼 타입, Math, Scanner와 자주 쓰는 컬렉션을 제공합니다. 레코드, 패턴 매칭 switch, 스트림, 리플렉션, 파일·네트워크 입출력, 가비지 컬렉션은 지원하지 않습니다. 이런 기능이 필요한 프로그램을 실행하면 이유를 알려 주는 오류가 납니다.

시작하기

앱을 열고 **Samples…**에서 프로그램을 고른 뒤 Start를 누르세요. 그다음 Step(F10)을 누를 때마다 한 단계씩 실행됩니다. 앱 화면은 영어로 되어 있습니다.