-
자바 가상 머신(Java Virtual Machine, JVM)이란?Programming Language/Java 2022. 3. 27. 15:18
Java Virtual Machine의 개념
정의
자바 컴파일 과정을 살펴본 사람들이라면 JVM이라는 개념이 어느 정도 익숙할 것이다. JVM은 '자바 컴파일러에 의해 생성된 자바 바이트 코드를 실행시키기 위한 가상머신'을 의미한다. JRE(Java Runtime Environment, 자바 런타임 환경)에 포함되어 있다. 즉, '코드를 실행하고, 해당 코드에 대한 런타임 환경을 제공하는 프로그램에 대한 사양'이다. 개발자들은 '어떤 기기 상에서 실행되고 있는 프로세스, 특히 자바 앱에 대한 리소스를 대표하고 통제하는 서버'를 지칭하기도 한다.
우리가 흔히 '자바는 OS에 독립적인 언어'라고 하는데 그렇게 될 수 있는 이유가 바로 이 JVM의 존재다. 즉, 그게 어떤 OS든지 JVM이 돌아가는 환경이라면 자바 소스코드를 구동시킬 수 있도록 한다.
기능
- 자바 프로그램의 OS 독립적 실행
- 자바 컴파일러에 의해 생성된 자바 바이트 코드는 반기계어기 때문에 OS는 이를 이해할 수 없다. 자바 바이트 코드를 OS가 이해할 수 있는 바이너리 코드로 변환시켜준다. 즉, JVM은 자바 소스코드와 OS 사이의 중개자 역할을 한다.
- 자바 바이트 코드는 JVM 내에서 변환된다. 때문에 JVM이 구동되는 환경이라면 자바 소스코드를 언제든지 구동할 수 있다. 이게 바로 'OS에 독립적'이라는 말의 의미다.
- 프로그램 메모리 관리 및 최적화
- Garbage Collection를 수행하는 모듈을 가지고 있다.
- 수동으로 메모리 관리를 해야 하는 C, C++과는 다르게 더 이상 쓰지이지 않는 메모리를 주기적으로 찾아 자동으로 제거한다.
클래스 로더는 동적 로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하고 런타임 데이터 영역(Runtime Data Area), 즉 JVM의 메모리에 올린다.
JVM의 구조 및 특징
- Class Loader
- 동적 로딩(Dynamic Loading)을 통해 JVM 내로 필요한 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행한다. 이 파일은 런타임 데이터 영역(Runtime Data Area), 즉 JVM의 메모리에 올린다.
- 클래스 로더 세부 동작
- 로드: 클래스 파일을 가져와 JVM의 메모리에 로드(사용되지 않는 클래스들은 메모리에서 삭제하는 컴파일러 역할도 수행)
- 검증: 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사
- 준비: 클래스가 필요로 하는 메모리 할당(필드, 메서드, 인터페이스 등)
- 분석: 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경
- Execution Engine
- 클래스를 실행시키는 역할이다. 클래스 로더는 JVM의 메모리(Runtime Data Area)에 올라온 바이트 코드를 명령어 단위로 배치시키고, 이를 Execution Engine(실행 엔진)이 실행한다.
- 두 가지 방식을 사용한다
- 인터프리터(Interpreter)
바이트 코드를 하나하나 불러와서 해석하고 실행함. '하나하나 불러와서 해석하고 실행'하는 단계에서는 빠르나, 전체적인 실행 속도가 느리다는 단점이 있다. - JIT 컴파일러(Just-In-Time Compiler)
인터프리터의 단점을 보완하기 위해 나온 방법으로 인터프리터 방식으로 실행하다가 일정 시점 이후부터 바이트 코드 전체를 바이너리 코드로 변환한다. 그 이후에는 따로 불러와서 해석할 필요 없이 바이너리 코드를 바로 실행하는 방식이다. 이때 해석된 코드는 Cache에 보관한다. 불러올 때마다 해석할 필요가 없기 때문에 인터프리터 방식보다 전체적인 실행 속도가 빠르다는 장점이 있다.
- 인터프리터(Interpreter)
- Runtime Data Area
- JVM에서 사용하는 메모리, JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역이다.
- 총 다섯 가지 영역으로 나누어져 있다.
- Method Area
JVM이 시작될 때 생성되고, JVM이 읽은 각각의 클래스와 인터페이스에 대한 런타임 상수풀, 필드 및 메서드 코드, 정적(static) 변수, 메서드의 바이트 코드 등을 보관함
덧붙여 모든 스레드가 공유하는 메모리 영역이다. - Heap Area
런타임에 동적으로 할당되는 데이터가 저장되는 영역으로 객체나 배열 생성이 여기에 해당한다.(즉, new 키워드로 생성된 객체와 배열이 생성되는 영역)
힙에 할당된 데이터들은 가비지 컬렉터의 대상이 되는데 JVM 성능 이슈에서 가장 언급되는 공간이다.
Method Area와 함께 모든 스레드가 공유하는 메모리 영역이다. - Stack Area
메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)을 생성한다. 그 후, 메서드 안에서 사용되는 값들을 저장하고 호출된 메서드의 지역변수, 매개변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다. 마지막으로 메서드 수행이 끝나면 프레임별로 삭제한다. - PC Register
스레드가 시작될 때 생성되며, 스레드가 어떤 명령어로 실행되어야 할지 기록하는 부분(현재 수행 중인 JVM 명령의 주소를 가짐) - Native Method Stack
실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역, 자바 외 언오로 작성된 코드를 위한 메모리 영역이기도 하다. Java Native Interface를 통해 바이트 코드로 전환하여 저장한다.
- Method Area
- Garbage Collection
- 수동으로 메모리 관리하는 C, C++과는 다르게 더 이상 쓰이지 않는 메모리를 주기적으로 찾아 자동으로 제거한다.
- 이 역할을 하는 것이 JVM의 가비지 컬렉션 프로세스.
- Runtime Data Area의 Heap Area영역에서 더 이상 참조되지 않는 객체를 정리한다.
- 오브젝트가 필요 없어진 시점에서 C, C++의 free() 메소드를 수행해 메모리를 확보한다.
- 실행 순서
- 참조되지 않는 객체들을 탐색 후 삭제
- 삭제된 객체의 메모리 반환
- 힙 메모리 재사용
참고
https://github.com/Songwonseok/CS-Study/blob/main/Language/Java/JVM.md
GitHub - Songwonseok/CS-Study: 면접 대비 CS 스터디(+알고리즘)
면접 대비 CS 스터디(+알고리즘). Contribute to Songwonseok/CS-Study development by creating an account on GitHub.
github.com
https://steady-coding.tistory.com/305
JVM 메모리 구조란? (JAVA)
안녕하세요? 코딩 중독입니다. 오늘은 JVM 메모리 구조에 대해 알아보겠습니다. JVM이란? JVM 메모리 구조를 설명하기 전에 JVM이 무엇인지 알아야 합니다. JVM은 Java Virtual Machine의 약자로, 자바 가상
steady-coding.tistory.com
https://goodncuteman.tistory.com/17
[Java] 자바 가상 머신(JVM) 구조 및 개념 정리
오늘은 JVM 가상머신에 관련해 정리해보겠습니다. * JVM (Java Virtual Machine) 이란? 자바 프로그램과 OS 사이에 중개자 역할을 수행하여 OS에 상관없이 재사용을 가능하게 해주는 플랫폼이다. 한정된
goodncuteman.tistory.com
https://asfirstalways.tistory.com/158
#자바가상머신, JVM(Java Virtual Machine)이란 무엇인가?
#JVM이란? JVM이란 JAVA Virtual Machine, 자바 가상 머신의 약자를 따서 줄여 부르는 용어이다 (가상머신이란 프로그램의 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것이다.) JV
asfirstalways.tistory.com
'Programming Language > Java' 카테고리의 다른 글
자바 컴파일 과정 (0) 2022.03.26 Java의 역사와 특징 (0) 2022.03.26 - 자바 프로그램의 OS 독립적 실행