티스토리 뷰
JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.
목표
자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.
학습 내용
JVM이란 무엇인가
- JVM는 자바 가상 머신(Java Virtual Machine)의 약자.
- JAVA 애플리케이션을 클래스 로드를 통해 읽어 들여 자바 API 와 함께 실행하는 역할
- 자바 코드로 작성한 프로그램을 실행할 환경(OS)에 구애받지 않고 재사용을 가능하게 해준다.
스택기반
으로 동작하는 가상머신- 참고) ARM 아키텍쳐 같은 하드웨어는
레지스터 기반
으로 동작
- 참고) ARM 아키텍쳐 같은 하드웨어는
컴파일 하는 방법
javac [.java 파일]
- 컴파일(Complie)
- .java 파일로 작성된 코드를 .class 파일(바이트코드)로 만드는 것.
- JDK(Java Development Kit) 에 포함된 Java Complier ( javac ) 를 통해 컴파일.
- 상위버전으로 컴파일된 .class 파일은 하위버전의 java 명령으로 실행이 되지 않는다.
- java.lang.UnsupportedClassVersionError 에러 출력. →
javac 컴파일 옵션
을 통해 해결 가능

실행하는 방법
java [.class 파일명]
- Java 컴파일러를 통해 생성된 바이트코드(.class파일)을 JVM의 클래스 로드를 통해 JVM으로 로딩.
- 로딩된 바이트코드들을 Execution engine을 통해 기계어로 해석해 Runtime Data Area에 배치하고 작업 수행
바이트코드란 무엇인가
JVM에서 실행되는 코드 (.class 파일)
1Byte 크기의 명령코드로 작성되어 바이트코드라고 불림
소스코드보다는 컴퓨터 중심적이나 기계어보다는 덜 추상적
정리하면 바이트코드는 JVM 이 이해할 수 있는 언어이며, JVM은 바이트코드를 기계어로 번역해 작업을 수행함.
JIT 컴파일러란 무엇이며 어떻게 동작하는지
JIT(Just-in-time) 컴파일러는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법
.
프로그램이 실행될 때 인터프리터를 통해 기계어 번역을 하면서 자주 쓰이는 코드를 캐싱한뒤, 이후에는 캐싱된 코드를 쓰기 때문에 인터프리터 방식의 느린 실행 속도를 개선할 수 있음.
JVM 구성 요소
Class Loader(클래스 로더)
- JVM 에 클래스를 로드하고, 링크를 통해 배치하는 작업 수행.
- jar파일 내 저장된 클래스들을 JVM위에 탑재하고 사용하지 않는 클래스들은 메모리에서 삭제
- 컴파일러 역할
- 자바는 동적코드로 런타임에 클래스들을 참조
- 클래스를 처음 참조할 때, 동적으로 클래스를 로드하고 링크하는 역할
Runtime Data Area
- 프로그램을 수행하기 위해 운영체제로부터 할당받은 메모리공간

1) PC Register
Thread 생성될 때, 하나씩 생성되는 공간
현재 수행 중인 JVM 명령의 주소
를 갖고 있음
2) JVM stack
변수, 임시 데이터, 스레드, 메소드의 정보를 저장하며, 메서드 수행이 끝날 때 바로 소멸되는 특성의 데이터를 저장하기 위해 임시로 할당되는 공간
메소드 호출시 각각의 스택 프레임을 생성하고 메소드 안에 사용되는 값(local variable)을 저장, 메소드 수행이 끝나면 프레임 단위로 삭제
3) Native Method Stack
자바 소스코드로 컴파일된 바이트코드가 아닌 기계어로 작성된 프로그램을 실행시키는 영역
4) Method Area (= Class Area, Static Area)
클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간.
5) Heap
new 연산자로 생성되는객체, 배열를 저장하는 가상 메모리 공간
Excution Engine(실행 엔진)
- 메모리에 로드된
클래스를 실행시키는 역할
- 인터프리터, JIT 컴파일러를 통해 자바 바이트코드를 기계가 실행할 수 있는 형태로 변경해 실행

JDK와 JRE의 차이
JDK
- Java Development Kit (자바 개발 도구)
- Java 로 프로그램을 작성하기 위한 개발자를 위해 JRE에 컴파일러 등을 추가
JRE
- Java Runtime Environment (자바 실행 환경)
- Java로 작성된 프로그램을 실행시키기 위한 것.
- JDK에 포함되어 있음
참고로, JAVA11 버전부터는 별도 JRE 를 제공하지 않음.

참고한 자료(ref)
_Jbee 님 블로그 https://asfirstalways.tistory.com/158
'바이트코드' 위키 https://ko.wikipedia.org/wiki/바이트코드
추가내용
javac 옵션
classpath (cp)
컴파일러가 컴파일 시 필요로 하는 라이브러리나 클래스의 경로를 지정해주는 옵션
스프링 프로젝트의 경우 gradle이나 maven 등으로 외부라이브러 등을 의존하는 경우가 대부분이기 때문에 컴파일 시 해당 옵션을 통해 해당 클래스들의 경로를 지정해주어야 함
d
클래스 파일을 생성할 디렉토리 설정
encoding
소스 파일에 사용된 문자열 설정
g
디버깅 정보 옵션
- -g:none 디버깅 정보를 생성시키지 않음
- -g:{lines, vars, source} 몇몇 디버깅 정보를 생성시킬 수 있음
- lines 라인정보, vars 지역변수, source 소스파일정보
nowarn
컴파일시 발생하는 경고메시지를 비활성화하는 옵션
sourcepath
소스파일의 위치를 지정해주는 옵션
-source release
허용되는 소스코드의 버전을 지정하는 옵션
-target version
지정된 릴리스버전의 가상머신에서 작동되는 클래스파일을 생성하는 옵션
해당 옵션으로 생성된 클래스 파일은 지정된 릴리스 버전의 이전 JVM 버전에서는 실행이 되지 않음
가상머신 구현방식: 스택기반, 레지스터기반
- 가상머신을 구현하는 방식의 차이로 피연산자와 연산 후 결과를 처리하는 방식이 차이남.
- 스택기반 가상머신
- 피연산자와 연산 후 결과를 스택에 저장
- 스택에 저장하고 빼내는 작업이 필요하기 때문에 PUSH, POP 명령이 필요
- 장점
- SP(Stack Pointer)를 통해 다음 피연산자의 메모리 위치를 나타내기 때문에 별도로 다음 피연산자의 위치를 기억할 필요가 없음

POP 20
POP 7
ADD 20, 7. result
PUSH result
- 레지스터 기반 가상머신
- 피연산자가 레지스터에 저장
- PUSH, POP 연산자가 없음
- 명령어가 피연산자의 위치인 레지스터 주소를 기억해야함
- 장점
- 하나의 명령으로 연산이 가능하기 때문에 속도가 더 빠르다
- 명령어 최적화를 적용할 수 있음(특정 연산의 결과를 레지스터에 저장해, 다시 사용가능)
- 단점
- 피연산자의 주소를 명시해주어야 하기 때문에 명령어의 길이가 더 길다.

ADD R1, R2, R3; #Add contents of R1 and R2, store result in R3
- Total
- Today
- Yesterday
- 샤인마토
- 애플워치 스포츠루프
- java
- 퇴근길page2정리
- 코로나19
- 일반투자기업
- 네이버
- metricbeat
- 고양이는귀여워
- 마켓컬리
- 24주적금
- elasticstack
- 애플액세서리 추천
- 휘점
- 국민연금
- 쿠팡
- 애플워치 액세서리
- YELLOWGIFT
- 라이언머그컵
- golang정규식
- 자바스크립트정규식
- 경제신의신과함께
- 애플워치 거치대
- 애플워치6
- 한정판굿즈
- 대설주위보
- 쿠팡프레시
- log4j2
- 일반투자
- 애플워치se
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |