Java

[JVM 밑바닥까지 파헤치기] 6-2. 클래스 파일 구조: 바이트코드 명령어

noahkim_ 2024. 12. 22. 23:19

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다

 

1. 바이트코드 명령어

  • 명령어 크기: 1바이트 (256개 가능)
  • 타입 내장 (ex. iload-int, fload-float)

 

기본 명령어

분류 명령어/설명
load
지역 변수 → 피연산자 스택
iload, aload, fload 등
store
피연산자 스택 → 지역 변수
istore, astore, fstore 등

 

산술 명령어

  • 피연산자 스택의 값 두 개를 이용해 특정한 산술 연산을 수행
  • 결괏값을 다시 피연산자 스택의 맨 위에 저장
타입 명령어 예시 설명
정수 연산 iadd, isub, imul, idiv, irem, ineg, iinc, iand, ior, ixor
피연산자 스택에서 연산 수행 후 결과 다시 push
비트 연산 ishl, ishr, iushr 등 비트 단위 이동
부동소수점 fadd, fdiv, dadd, dmul 등
IEEE 754 기반. 근사값 저장, 정확성 확보 목적

 

 

형변환 명령어

  • 숫자 타입 데이터를 다른 숫자 타입으로 변환
유형 설명
Upcasting
표현 범위가 넓어질 때: JVM이 자동 수행
Downcasting
표현 범위가 줄어들 때: 명시적 명령어 필요, 일부 비트 손실 가능, 런타임 에러는 없음
예: i2b, i2c, d2i, l2f 등

 

객체 및 배열 생성 명령어

기능 명령어 예시 설명
객체 생성 new
클래스 인스턴스 생성
배열 생성 newarray, anewarray, multianewarray
1차원/다차원 배열 생성
타입 확인 instanceof 타입 체크
필드 접근 getfield, putfield, getstatic, putstatic
인스턴스/정적 필드 접근
배열 접근 baload, caload, saload → 배열 → 스택
bastore, castore, sastore → 스택 → 배열
배열 원소 로드/저장

 

피연산자 스택 관리 명령어

명령어 설명
pop 스택 맨 위 값 제거
dup
최상위 스택 값 복제
swap
스택 상위 두 값을 교환

 

제어 흐름 명령어

명령어 설명
if<cond>
조건에 따라 분기 (ifeq, ifne, iflt, if_icmpeq 등)
goto 무조건 분기
tableswitch
복합 조건 분기 (switch-case 구현에 사용)

 

메서드 호출과 반환 명령어

호출 관련 명령어 설명
invokevirtual
인스턴스 메서드 호출
invokeinterface
인터페이스 메서드 호출
invokestatic
정적(static) 메서드 호출
invokespecial
생성자 or private 메서드 호출
ireturn, freturn, areturn, return
메서드 종료 및 값 반환

 

예외 처리 명령어

명령어 설명
athrow
예외를 명시적으로 발생시킴
예외 처리 구조
.class에는 예외 테이블(exception table)이 함께 존재하여 catch 블록 대응

 

동기화 명령어

수준 구현 방식
메서드 수준
synchronized 메서드
블록 수준
monitorenter / monitorexit 명령어로 동기화 영역 제어
반환 시 동기화 해제
monitorexit → 동기화 블록 정상 종료 or 예외 발생 시 해제 필요