Java

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

noahkim_ 2024. 12. 22. 23:19

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

 

1. 바이트코드 명령어

길이

  • 1바이트 
    • 최대 256개의 연산 코드 표현 가능

 

데이터 타입

  • 명령어 자체에 해당 연산에 필요한 데이터의 타입 정보가 포함됨
    • iload: int 타입 데이터 로드
    • istore: int 타입 데이터 스토어

 

2. 로드

  • 지역변수를 피연산자 스택에 로드

 

3. 스토어

  • 피연산자 스택의 연산 결과를 지역변수에 저장

 

4. 산술 명령어

  • 피연산자 스택의 값 두 개를 이용해 특정한 산술 연산을 수행
    • 결괏값을 다시 피연산자 스택의 맨 위에 저장

 

정수
  • int 타입용 명령어만 지원
    • iadd, isub, imul, idiv, irem, ineg, ishl, ior, iand, ixor, iinc, dcmpg

 

부동 소수점
  • IEEE 754 명세를 엄격히 따름
    • 근사값으로 반올림하여 결과를 저장
  • 정확성 (모호성을 없애줌)

 

5. 형변환 명령어

  • 숫자 타입 데이터를 다른 숫자 타입으로 변환

 

Upcasting

  • 표현 범위가 넓어지는 경우
  • 변환 명령어를 명시하지 않아도 가상머신이 알아서 수행해줌

 

Downcasting

  • 표현 범위가 축소되는 경우
  • 형 변환 명령어를 반드시 명시해야 함
  • 부호나 단위가 바뀌거나 수치 정밀도가 떨어질 수 있음
    • 제한된 바이트까지만 표현되고 나머지는 버려짐
  • 런타임 에러가 발생하지는 않음

 

6. 객체 생성 명령어

  • new: 인스턴스 생성
  • instanceof: 인스턴스 타입 확인
  • newarray, arewarray, multianewarray: 배열 생성
  • arraylength: 배열 길이
  • getfield, putfield, getstatic, putstatic: 필드 접근
  • baload, caload, saload: 배열 원소 -> 피연산자 스택
  • bastore, castore, sastore: 피연산자 스택 -> 배열 원소

 

7. 피연산자 스택 관리 명령어

  • pop: 최상위 스택 원소 꺼내기
  • dup: 최상위 스택 원소를 꺼내 복제한 후, 복제된 값을 스택의 최상위에 올리기
  • swap: 스택의 최상에 있는 값 두개 치환

 

8. 제어 전이 명령어

  • ifeg: 조건 분기
  • tableswitch: 복합 조건 분기
  • goto: 무조건 분기

 

9. 메서드 호출과 반환 명령어

  • invokevirtual: 객체의 인스턴스 메서드 호출
  • invokeinterface: 인터페이스 메서드 호출
  • invokestatic: 클래스 메서드 호출
  • ireturn: int 반환
  • areturn: 참조 반환

 

10. 예외 처리 명령어

  • athrow: 예외 던지기 (명시적)
  • 비정상적인 상황일 경우, 예외 테이블을 이용해 예외 처리 구현

 

11. 동기화 명령어

수준

  • 메서드 수준 동기화
  • 블록 수준 동기화

 

구현

메서드 호출
모니터 사용 (락)
  • monitorenter: 동기화 블록 진입
  • monitorexit: 동기화 블록 종료
반환 명령어