JVM 이란 ?
JVM은 Java Virtual Machine의 줄임말입니다. 자바를 실행하기 위한 가상머신을 의미합니다. 자바는 운영체제에 독립적이라는 특징을 가지고 있습니다. C, C++과 다르게 Java는 OS에 종속적이지 않게 실행하기 위해 OS 위에서 Java를 실행시킬 것이 팔요합니다. 그것이 바로 JVM입니다.
일반적인 소스코드와 Java 소스코드를 실행하는 과정의 차이를 나타내는 그림입니다. JVM을 사용하지 않는 일반적인 소스코드는 컴파일 플랫폼과 타겟 플랫폼이 다를 경우, 프로그램이 동작하지 않습니다. 예를 들어 리눅스에서 컴파일해서 나온 실행파일은 윈도우에서 실행되지 않습니다. 이는 운영체제마다 지원하는 인터페이스가 다르기 때문입니다. 타겟 플랫폼에 맞추어 컴파일하는 것을 크로스 컴파일이라고 합니다. 이와 다르게 자바는 JVM으로 이 문제를 해결합니다. 자바 소스코드를 자바 컴파일러가 컴파일하면 바이트코드가 생성되는데, JVM은 이 바이트코드를 운영체제에 맞는 실행파일로 만들어줍니다. 어떤 운영체제든지 JVM이 설치되어있으면 잘 동작하기 때문에 운영체제에 독립적인 것입니다. 물론 운영체제에 맞는 JVM이 설치되어 있어야 합니다.
위 그림은 자바 소스코드가 어떻게 실행되는지에 대한 과정을 나타냅니다. java compiler는 MyProgram.java파일을 MyProgram.class라는 자바 바이트코드로 컴파일합니다. 바이트코드는 기계어가 아니기 때문에 운영체제에서 바로 실행가능하지 않습니다. JVM은 이 바이트코드를 기계가 이해할 수 있도록 해석해주는 역할을 합니다. 다음 코드는 자바 소스코드를 실행시키는 명령어를 나타냅니다. javac는 JDK의 bin 폴더 안에 들어있는 컴파일러입니다. java 명령어로 JVM을 실행시킬 수 있습니다.
#java 소스코드를 바이트코드로 변환
javac MyProgram.java
#java 바이트코드를 JVM을 통해서 실행
java MyProgram
JVM의 동작 방식
- 자바 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당합니다.
- Java 컴파일러가 Java 소스코드(.java)를 Java 바이트코드(.class)로 컴파일합니다.
- Class Loader가 바이트코드를 JVM Runtime Data Area로 로딩합니다.
- Runtime Data Area에 로딩된 .class 파일들을 Execution Engine이 해석합니다.
- 해석된 바이트코드는 Runtime Data Area의 각 영역에 배치되고 수행되며, 이 과정에서 GC의 작동, 스레드 동기화가 이루어집니다.
클래스 로더(Class Loader)
자바는 동적으로 클래스를 읽어옵니다. 프로그램이 실행 중인 런타임에서 모든 코드가 JVM과 연결됩니다. 클래스 로더는 Runtime시 .class를 런타임 데이터 영역에 로딩합니다. 이 과정에서 내부 레퍼런스 링킹, static 변수 초기화 등이 일어납니다.
실행 엔진(Execution Engine)
로드된 바이트코드를 실행하는 런타임 모듈입니다. 클래스 로더는 바이트코드를 Runtime Data Area의 Method Area에 배치합니다. 배치한 이후에 JVM은 Method Area의 바이트코드를 실행 엔진에 제공하고, 실행 엔진은 바이트코드를 명령어 단위로 읽고 실행시킵니다.
- 인터프리터(Interpreter) : 자바 바이트코드를 명령어 단위로(한 라인씩) 읽어서 기계어로 변환합니다. 중복되는 바이트코드를 매번 컴파일하게 되어 비효율적입니다.
- JIT(Just In Time) 컴파일러 : 한줄씩 읽는 인터프리터의 속도 문제를 해결하기 위해 만들어진 기능입니다. 인터프리터가 반복되는 코드를 발견하면 JIT 컴파일러로 반복되는 코드를 모두 기계어로 바꿉니다.
런타임 데이터 영역(Runtime Data Area)
런타임 테이터 영역은 JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다. 힙 영역과 메서드 영역은 모든 스레드가 공유해서 사용합니다. GC의 대상이 됩니다. 스택, PC 레지스터, 네이티브 메서드 스택은 스레드마다 하나씩 생성됩니다.
- 메서드 영역 : 클래스 멤버변수 이름, 데이터타입, 접근제어자 정보같은 필드, 메서드 정보, static변수, final class 등이 생성되는 영역입니다. Constant Pool 영역은 타입별 상수 리터럴 정보를 담는 곳입니다.
- 힙 영역 : new 키워드로 생성된 객체, 배열이 저장되는 영역입니다. GC가 주기적으로 제거하는 영역이기도 합니다.
- 스택 영역 : 지역변수, 파라미터, 리턴값, 연산에 사용되는 임시 값 등이 생성되는 영역입니다.
- PC 레지스터 : 스레드가 생성될 때마다 생성되는 영역으로, 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역입니다.
- 네이티브 메서드 스택 : 자바 이외의 언어로 작성된 네이티브 코드를 실행할 때 사용되는 영역입니다.
가비지 컬렉터(Garbage Collector)
JVM은 가비지 컬렉터를 이용하여 더이상 사용되지 않는 메모리를 자동으로 회수합니다. 개발자가 따로 메모리를 관리하지 않아도 되므로 손쉽게 프로그래밍을 할 수 있도록 도와줍니다. Heap 메모리 영역에 적재된 객체들 중 참조되지 않은 객체들을 탐색 후 제거하는 식으로 작동합니다. 해당 역할을 하는 시간은 정확히 언제인지 알 수 없으며, GC를 수행하는 스레드를 제외한 나머지 모든 스레드들은 일시정지상태가 됩니다. 자세한 내용은 추후에 따로 글을 작성할 예정입니다.
JVM의 소개와 내부 구조에 대한 글을 써보았습니다. 자바를 배우는 입장이라 복잡한 내용도 있는 것 같고 얼렁뚱땅 넘어간 부분도 있습니다. 공부를 해나가면서 JVM 구성요소의 특정 파트에 대한 내용도 써볼까 합니다.
참고한 블로그들
https://coding-factory.tistory.com/828
[Java] 자바 JVM 내부 구조와 메모리 구조에 대하여
저번 포스팅에서는 JVM에 대해서 간략하게 알아보는 시간을 가졌다면 이번 포스팅에서는 JVM의 내부 구조에 대해 좀 더 자세하게 알아보도록 하겠습니다. 혹시 JVM의 정의와 왜 필요한지 궁금하시
coding-factory.tistory.com
https://coding-factory.tistory.com/827
[Java] 자바 가상머신 JVM(Java Virtual Machine) 총정리
JVM(Java Virtual Machine)이란? 자바 가상 머신 JVM(Java Virtual Machine)은 자바 프로그램 실행환경을 만들어 주는 소프트웨어입니다. 자바 코드를 컴파일하여 .class 바이트 코드로 만들면 이 코드가 자바 가
coding-factory.tistory.com
https://www.youtube.com/watch?v=UzaGOXKVhwU
https://huelet.tistory.com/entry/JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0
JVM 메모리구조
1. 메모리 프로그램을 실행하기 위한 데이터 및 명령어를 저장하는 공간 ※ 메모리구조를 공부하는 이유 - 같은 기능의 프로그램이더라도 메모리 관리에 따라 성능이 좌우됨. - 메모리 관리가 되
huelet.tistory.com
'JAVA' 카테고리의 다른 글
[JAVA] Garbage Collection(GC) (0) | 2023.03.12 |
---|---|
[JAVA] 자바 언어 특징 (0) | 2023.02.17 |