랩터
[Java] 자바 가상 머신(Java Virtual Machine) 본문
자바는 C++처럼 객체지향 프로그래밍이 가능하면서도, 운영체제로부터 독립되어 있으므로, 자바로 소스 코드를 한 번만 작성하면 어떤 운영체제에서도 코드를 수정할 필요 없이 프로그램을 실행시킬 수 있습니다. 이와 같은 운영체제로부터의 독립성은 JVM이라는 별도의 프로그램을 통해서 구현됩니다.
학습 목표
- JVM이 무엇인지 이해한다.
- JVM의 메모리 구조를 개괄적으로 이해한다.
- 가비지 컬렉션이 무엇인지 이해한다.
JVM이란?
JVM(Java Virtual Machine)은 자바 프로그램을 실행시키는 도구입니다. 즉 JVM은 자바로 작성한 소스 코드를 해석해 실행하는 별도의 프로그램입니다. JVM은 자바 프로그램과 운영체제 사이에서 일종의 통역가 역할을 수행합니다.
JVM 구조
JVM의 내부 구조 그림입니다.
자바로 소스 코드를 작성하고 실행하면, 먼저 컴파일러가 실행되면서 컴파일이 진행됩니다. 컴파일의 결과로 .java 자바소스코드가 .class확장자를 가진 바이트 코드파일로 변환됩니다.
javac는 컴파일러입니다. 자바를 설치하면 무조건 깔립니다.
JVM은 크게 Class Loader 부분과 Execution부분, Runtime Data Area로 나뉩니다.
JVM은 운영 체제로부터 소스 코드 실행에 필요한 메모리를 할당받습니다. 그것이 런타임 데이터 영역입니다.
클래스 로더가 바이트 코드 파일을 JVM내부로 불러들여 런타임 데이터 영역에 적재시킵니다. 자바 소스 코드를 메모리에 로드시키는 것입니다.
로드가 완료되면 실행엔진(Execution)이 런타임 데이터 영역에 적재된 바이트 코드를 실행시킵니다.
실행 엔진은 두가지 방식으로 바이트 코드를 실행시킵니다.
1.인터프리터:코드를 한줄씩 기계어로 번역하고 실행시킴
2.JIT Compiler: 바이트 코드 전체를 기계어로 번역하고 실행시킴
실행 엔진은 기본적으로 1번의 방법을 통해 바이트 코드를 실행시키다가, 특정 바이트 코드가 자주 실행되면 해당 바이트 코드를 JIT Compiler를 통해 실행시킵니다.
즉, 중복적으로 어떤 바이트 코드가 등장할 때, 인터프리터는 매번 해당 바이트 코드를 해석하고 실행하지만, JIT 컴파일러가 동작하면 한 번에 바이트 코드를 해석하고 실행시킵니다.
Stack과 Heap
JVM에 Java 프로그램이 로드되어 실행될 때 특정 값 및 바이트코드,객체,변수 등과 같은 데이터들이 메모리에 저장되어야 합니다. 런타임 데이터 영역이 바로 이러한 정보를 담는 메모리 영역입니다.
이 중에서 Heap과 Stack을 살펴보겠습니다.
Stack 영역이란?
스택은 일종의 자료구조입니다. 스택은 흔히 LIFO(후입선출)라는 키워드로 설명되는데 마지막에 들어간 데이터가 가장 먼저 나온다는 의미입니다. 프링글즈 통을 생각하면 이해될것입니다.
JVM안에서 Stack은 어떻게 작동할까요?
메서드가 호출되면 그 메서드를 위한 공간인 Method Frame이 생성됩니다. 메서드 내부에서 사용하는 다양한 값들(참조,매개,지역변수 리턴값 등)들이 임시로 저장됩니다.
Method Frame이 Stack에 호출되는 순서대로 쌓이게 되는데, Method의 동작이 완료되면 역순으로 제거됩니다.
Heap 영역이란?
JVM에는 단 하나의 Heap영역이 존재합니다. JVM이 작동되면 이 영역은 자동 생성됩니다.이 영역안에 객체,인스턴스 변수,배열이 저장됩니다.
Person person = new Person();
new Person()이 실행되면 Heap영역에 인스턴스가 생성되며, 인스턴스가 생성된 위치의 주소값을 person에게 할당해 주는데, 이 person은 Stack영역에 선언된 변수입니다.
객체를 다룬다는 것은 Stack영역에 저장되어 있는 참조 변수를 통해 Heap영역에 존재하는 객체를 다룬다는 의미가 됩니다. 정리하면, Heap영역은 실제 객체의 값이 저장되는 공간입니다.
Garbage Collection이란?
자바에서는 가비지 컬렉션이라는 메모리를 자동으로 관리하는 프로세스가 포함되어 있습니다. 가비지 컬렉션은 프로그램에서 더이상 사용하지 않는 객체를 찾아 삭제하거나 제거하여 메모리를 확보하는 것을 의미합니다.
가비지 컬렉터는 아무한테도 참조되고 있지 않은 객체 및 변수들을 검색하여 메모리에서 점유를 해제하며, 그럼으로써 메모리 공간을 확보하여 효율적으로 메모리를 사용할 수 있게 해줍니다.
'공부 > JAVA' 카테고리의 다른 글
[Java] 컬렉션 연습문제 (0) | 2024.07.10 |
---|---|
[Java] 스트림 연습문제 (0) | 2024.07.10 |
[Java] 스레드 (0) | 2024.07.10 |
[Java] 파일 입출력 (0) | 2024.07.09 |
[Java] 스트림 - Optional Class (0) | 2024.07.09 |