Hello.java 가 어떻게 운영체제 위에 올라가서 작동하는지 보여주는 그림이다.
- javac 컴파일러가 .class 파일을 만들어준다. Java Byte Code 클래스이고 이것이 jvm 위에서 올라가는 것이다.
- 어떠한 운영체제이냐에 따라 jvm 이 존재한다. 돌리고자하는 운영체제의 jvm에서 .class 파일을 Execution Engine를 통해 해석하고 실행시킨다.
JVM 구성
이전에는 전체적인 흐름을 보았고 이젠 jvm 에서 어떻게 실행되는지 보도록 하자.
Class Loader (클래스 로더)
자바는 기본적으로 컴파일 타임이 아니라 런타임에 참조한다. 그래서 처음 클래스를 참조할 때 해당 클래스를 로드하고 링크하는 과정이 필요하다.
Loading : 흩어져있는 .class 확장자를 가진 클래스 파일들을 찾아서 JVM의 메모리(Method Area) 에 탑재해준다. (기본적인 라이브러리 포함)
Linking, Initialization : 로드된 클래스 파일들을 검증하고 사용 준비 (유효한 클래스 파일인지 확인, static field 를 메모리에 할당하고 기본 값으로 초기화, 인스턴스 변수가 실제 클래스를 가리킬 수 있도록 연결)
Execution Engine (실행 엔진)
클래스 로더가 JVM의 런타임 데이터 영역에 자바 바이트 코드를 올린다. 하지만 자바 바이트 코드는 기계어가 아니다. 따라서 기계가 읽을 수 있도록 변환해주는 것이 필요한데 두 가지 방식이 있다.
1. Interpreter (인터프리터) : 자바 바이트 코드를 런타임에 instruction 단위로 한 줄 씩 읽고 수행한다. 한 줄 씩이기 때문에 실행속도가 느리다.
2. JIT 컴파일러 : 인터프리터를 개선하기 위해 도입된 컴파일러. 인터프리터 방식으로 실행하다가 중간에 적절한 시점에 바이트 코드 전체를 컴파일하여 네이티브 코드로 변경한다. 이렇게 미리 컴파일된 네이티브 코드는 캐시에 보관되어 나중에 다시 사용할 때는 컴파일 하지 않고 캐시에서 읽어낸다. 여기서 주목할 점은 인터프리터 보다 컴파일러가 훨씬 느리다는 것이다. 그래서 적절할 때에만 컴파일하는 것이 필요한데 자주 쓰이는 코드가 해당된다.
Runtime Data Area
1. PC Register
어떠한 instruction 이 수행되어야 될지에 대한 JVM insturction 의 주소를 저장한다. 쓰레드 별로 실행되는 구간이 다르기 때문에 쓰레드 별로 가진다.
2. JVM 스택 영역
원시타입 지역 변수 (local variablie), 호출된 메소드의 매개변수, 리턴 값 등 임시로 사용되는 데이터를 저장하는 공간
3. Native Method Stack
JVM 스택 영역은 자바 코드를 위한 공간이라면 Native Method Stack은 c, c++ 등 다른 언어로 작성된 코드를 실행하기 위한 스택이다.
4. Method Area
static 한 영역으로 프로그램 시작 전에 올라가고 프로그램이 종료되면 소멸되는 공간이다. 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간이다. Runtime Constant Pool 이라고 상수 자료형을 저장하여 참조하는 영역이 함께 존재한다. Heap 영역은 인스턴스가 올라가는 공간인 반면 Method Area는 클래스 데이터가 올라가는 공간이다.
5. Heap
객체를 저장하는 공간으로 GC의 대상이 되는 공간이다. (ex. new String("abc")) String Constant Pool 은 Heap 영역에 존재한다.
(new String("abc") 와 String s = "abc" 의 차이 참고)
- Permanent : 생성된 객체들의 정보의 주소값이 저장되는 공간. 클래스 로더에 의해 load되는 class, method 등에 대한 메타 정보가 저장되며 JVM에 의해 사용된다. Reflection 을 사용하여 동적으로 클래스가 로딩 되는 경우에도 사용된다.
- Reflection이란? 객체를 통해 클래스의 정보를 분석해 내는 프로그래밍 기법
구체적인 클래스 타입을 알지 못해도, 컴파일된 바이트 코드를 통해 역으로 클래스의 정보를 알아내어 사용할 수 있다는 뜻이다.
- Reflection이란? 객체를 통해 클래스의 정보를 분석해 내는 프로그래밍 기법
- New/Young
- Eden : 객체들이 최초로 생성되는 공간. Eden 영역이 가득차게 되면 첫 번째 GC가 발생한다. (Eden 영역에 있는 값들을 Survivor 1 영역에 복사하고 이 영역을 제외한 나머지 객체를 삭제)
- Survivor 0/1 : Eden 에서 참조되는 객체들이 저장되는 공
- Old : Young 에서 가비지 컬렉션으로 마지막까지 살아남은 객체가 Old 로 오게된다. 즉, 오래된 데이터가 저장되는 영
참고
http://asfirstalways.tistory.com/158
https://www.devkuma.com/docs/jvm/memory-structure/
https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80
https://12bme.tistory.com/382
'📗Java' 카테고리의 다른 글
[모던자바인액션] 동작 파라미터화 코드 전달하기 (0) | 2023.09.11 |
---|---|
[Java] Garbage Collection (0) | 2023.09.07 |
[Java] 쓰레드 동기화 (0) | 2023.08.29 |
[Java] String 클래스 메소드, StringBuffer, StringBuilder (0) | 2023.07.23 |
[Java] 예시와 함께 알아보는 추상화 - 추상클래스와 인터페이스 (0) | 2023.07.20 |