-
자바 가상머신(JVM) 의 구조JAVA 2021. 5. 14. 23:41
자바 프로그램이 실행될 때 어떤 방식으로 메모리에 올라가서 실행이 되는지 알아보겠습니다.
자바 프로그램 실행 과정
먼저 자바는 OS나 하드웨어에 상관없이
"*.java" 파일을 JAVA컴파일러(javac)가 컴파일 시키면
자바 바이트코드로 이루어진 "*.class" 라는 파일로 바뀌게 됩니다.
이렇게 만들어진 class파일을 JVM이 로딩을 하여 실행시키게 됩니다.
출처-구글 이미지검색 그러면 자바바이트로 변환된 class는 JVM 에서 로딩되어 실행 되는지 자세히 알아보겠습니다.
자바 가상머신(Java Virtual Machine)
JVM은 JRE(Java Runtime Environment/자바 런타임 환경)에 들어있는 프로그램입니다.
~ JRE는 JVM에서 실행하기 위한 자바 애플리케이션을 로드하는 온디스크 프로그램이다. JRE는 자바 개발 키트(JDK)를 다운로드할 때
기본적으로 포함되며 각 JRE에는 코어 자바 클래스 라이브러리, 자바 클래스 로더, 자바 가상 머신이 포함된다.
출처-구글이미지 검색 JVM의 구조는
Garbage Collector, Execution Engine, Class Loader, Runtime Date Area 로 크게 나뉩니다.
Class Loader(클래스 로더)
모든 자바 어플리캐이션 프로그램은 클래스로 이루어져 있습니다.
클래스로더는 컴파일된 클래스들을 JVM이 처리(실행)할수 있게 동적으로 로드하는 역할을 합니다.
그렇기 때문에 JVM에서 클래스 로더는 필수적으로 존재해야만 합니다.
Execution Engine(실행 엔진)
실행엔진은 클래스로더로 인해 메모리에 로드(적재)된 클래스들을
기계어로 변경해 명령어 단위로 실행하는 역할을 합니다.
명령어를 기계어로 바꾸는 방식에는 명령들을 순차적으로 읽어서 처리하는 Interpreter 과
반복되는 자바바이트코드 들을 기억해놔서 처리속도를 향상시킨 JIT Compiler(Just in Time) 방식이 있습니다.
Gabage Collector(Collection)
GC는 Heap 영역에서 참조되지 않는 겍채(object)들을 제거하는 역할을 합니다.
Runtime Data Area
Runtime Data Area는 OS로부터 할당받는 JVM의 메모리 영역입니다.
출처-구글이미지 검색 PC Register , JVM stack , Native Method stack 은 각 Thread별로 독자적으로 존재하며
Heap , Method Area 는 같은 메모리를 참조합니다.
Program Counter Register
PC Register는 Thread가 생성될 때 마다 생기는 공간으로 Thread가
어떠한 명령을 실행하게 될지에 대한 부분을 기록을 합니다.
JVM stack
JVM stack은 Thread의 수행정보들을 저장합니다.
예로 main 메소드가 실행되면 main 메소드에 대한 Thread가 하나 생기고
그작업에 대한 정보들이 stack에 저장되게 됩니다.
JVM stack 에는 매개변수, 지역변수, 참조변수 같은 것들이 저장되게 됩니다.
JVM stack의 값들은 메소드의 호출이 종료되면 값들은 삭제가 됩니다.
Native Method stack
자바외의 코드가 쌓이는 공간입니다.
Heap
Heap영역은 모든 Thread가 참조하는 하나의 공간입니다.
Heap영역에는 new로 생성된 객체나 배열들이 저장된 영역입니다.
Method Area
Method Area 영역은 모든 Thread가 참조하는 하나의 공간입니다.
Method Area(Static Area) 패키지 클래스, 런타임 상수풀(Runtime Constant Pool), 인터페이스, 상수, final 변수, 클래스 멤버 변수 등 필드데이터, 생성자를 포함한 모든 메서드 코드(정보)들을 한번 로드후 저장하고 있는 영역입니다.
~자바에서 주로쓰이는 Math.* 이 객체 생성없이 되는 이유는 Math.* 의 클래스가 Method Area 에 존재해서이다.
참고 사이트
https://honbabzone.com/java/java-jvm/
https://www.itworld.co.kr/news/110768
'JAVA' 카테고리의 다른 글
제네릭(Generic) (0) 2021.10.28 정수 배열의 분포를 출력하는 메소드 (0) 2021.04.28