본문 바로가기

JAVA

[JAVA] JVM 메모리 영역

728x90
JVM이 사용하는 메모리 영역에 대한 공부 기록이다.

개요

JVM(Java Virtual Machine)이란??

자바가 실제로 구동하는 환경

운영체제별로 프로그램을 실행하고 관리하는 방법이 다르기 때문에

원래는 운영체제별로 자바 프로그램을 별도로 개발해야 한다.

 

하지만 JVM은 언어 그대로 가상 환경에서 구동된다.

JVM의 주요 역할은 운영체제와 자바 프로그램을 중계함으로써

하드웨어나 운영체제에 따라 달라질 수 있는 호환성의 문제를 해결한다.

덕분에 개발자는 운영체제와 상관없이 자바 프로그램을 개발할 수 있다.

 

바이트 코드는 모든 JVM에서 동일한 실행 결과를 보장하지만, JVM은 운영체제에 종속적이다.

따라서 JVM은 운영체제에 맞게 설치되어야 한다.

JVM은 JDK(Java Development Kit) 또는 JRE(Java Runtime Environment)를 설치하면

자동으로 설치되기 때문에 JDK와 JRE를 운영체제 별로 제공한다.

 

JDK(Java Development Kit)

JDK는 Java의 표준안인 Java SE(Standard Edition)의 구현체이다.

프로그램 개발에 필요한 JVM, 라이브러리 API, 컴파일러, javac, javadoc 등의 개발 도구를 모두 포함하는 것이다.

또한 자바 코드를 실행하기 위한 JRE도 포함한다.

JRE(Java Runtime Environment)

JRE는 자바 실행 환경이다.

따라서 자바로 만들어진 프로그램을 실행시키는데 필요한 라이브러리들과 각종 API, JVM을 포함한다.

 

정리하면 JDK는 자바 프로그램을 개발하기 위한 도구기 때문에 실행 환경인 JRE를 포함하고,

만약 개발된 프로그램을 실행하기만 한다면(읽기) JRE만 갖춰지면 된다. 

 

이를 가시화하면 아래와 같고,

결과적으로 .java 확장자의 소스 파일을 컴파일러가 JVM이 이해할 수 있도록 바이트 코드 파일로 바꾸면,

JVM은 운영체제에 할당받은 메모리 영역을 세부 영역으로 구분해서 사용한다.

 

이번 기록에서는 구분된 세부 영역에 대해서 다루려고 한다.


JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area를 가시화하면 아래와 같다.

모든 스레드가 공유하는 영역

Method Area

메소드 영역에서 코드에서 사용되는 클래스(.class)들을 클래스 로더로 읽어

런타임 상수풀, 필드 데이터, 메소드 데이터, 메소드 코드, 생성자 코드 등을 분류해서 저장한다.

ex)메소드 정보, 클래스 정보, static 변수 정보, 상수 정보 

 

메소드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.

Class Loader
클래스 로더는 런타임 중에 동적으로 저장된 클래스를 JVM위에 탑재하고,
사용하지 않는 클래스를 메모리에서 삭제하는 역할을 한다.

Heap Area

객체를 저장하는 가상 메모리 공간

new 명령어로 생성한 모든 인스턴스와 객체들이 이 영역에 저장된다.

JVM은 자동으로 메모리를 관리해 주는 GC(Garbage Collector)를 실행시켜

쓰레기 객체를 힙 영역에서 자동으로 제거한다.

각 스레드마다 생성되는 영역

Stack Area

스택은 메소드를 호출할 때마다 위 그림과 같이 프레임을 추가하고(push)

메소드가 종료되면 해당 프레임을 제거(pop)한다.

 

프레임은 메소드가 호출될 때마다 만들어지고, 메소드 상태 정보를 저장한다.


참고

 

JVM stack과 frame

 

johngrib.github.io

 

JVM Internals

Explains the internal architecture of the Java Virtual Machine (JVM) in simple terms using showing key components and how memory is updated during execution.

blog.jamesdbloom.com

https://d2.naver.com/helloworld/1230

마무리

JVM에 관해 알게 되거나 궁금한 것이 있으면 기록에 추가할 예정이다.

잘못된 정보에 대한 피드백은 환영입니다.

728x90