저우즈밍 님의 "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: 동기화 블록 종료
반환 명령어
'Java' 카테고리의 다른 글
[JVM 밑바닥까지 파헤치기] 7-2. 클래스 로딩 매커니즘: 클래스 로더 (0) | 2024.12.23 |
---|---|
[JVM 밑바닥까지 파헤치기] 7-1. 클래스 로딩 매커니즘: 클래스 로딩 처리 과정 (3) | 2024.12.23 |
[JVM 밑바닥까지 파헤치기] 6-1. 클래스 파일 구조: 클래스 파일 (0) | 2024.12.22 |
[JVM 밑바닥까지 파헤치기] 3-5. 가비지 컬렉터와 메모리 할당 전략: 저지연 가비지 컬렉터 (0) | 2024.12.21 |
[JVM 밑바닥까지 파헤치기] 3-4. 가비지 컬렉터와 메모리 할당 전략: 클래식 가비지 컬렉터 (0) | 2024.12.21 |