///////
Search
📌

JVM의 메모리 구조에 대해서 설명해 주세요.

JVM 이란?
자바 프로그램 실행환경을 만들어 주는 소프트 웨어.
자바 실행 환경 JRE(Java Runtime Environment)에 포함되어 있다.
JVM을 사용하면 하나의 바이트 코드로 모든 플랫폼에서 동작하도록 할 수 있다.
※ Java는 플랫폼에 종속적이지 않지만 JVM은 플랫폼에 종속적이다.
리눅스의 JVM과 윈도우의 JVM은 서로 다르다. 자바로 작성된 모든 프로그램은 자바 가상 머신에서만 실행될 수 있으므로, 자바 프로그램을 실행하기 위해서는 반드시 자바 가상 머신이 설치되어 있어야 한다.
JVM 메모리 구조
프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리(Runtime Data Area)를 할당받고, JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
모든 스레드가 공유해서 사용 ( GC의 대상 ) - 힙 / 메서드
스레드마다 하나씩 생성 - 스택/PC레지스터/네이티브 메서드 스택
메서드 (스태틱) 영역
클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 Type 정보, Constant Pool, static변수, final class 등이 생성되는 영역
간단히 말하자면 메서드 영역에는 정적 필드와 클래스 구조만을 갖고 있다고 할수있다.
JVM 시작시 생성, 프로그램 종료 시까지 데이터 유지
힙 영역
new 키워드로 생성된 참조형 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장 되는 공간
Heap 영역에 있는 오브젝트들을 가리키는 참조 변수는 stack에 적재
힙 영역에 보관되는 메모리는 Stack 영역과 다르게 메모리 호출이 끝나도 사라지지 않고 유지된다. ( 단, GC에 의해 삭제 or JVM이 종료 시 삭제됨. )
힙 메모리가 가득차면 java.lang.OutOfMemoryError : Java Heap Space 에러를 발생
주기적으로 GC가 제거하는 영역, 효율적인 GC를 위해 크게 3가지의 영역으로 나눈다.
Generation
설명
GC
Young
Heap 영역에 객체가 생성되면 최초로 Eden 영역에 할당됨. 그 후 데이터가 어느정도 쌓이면, 참조정도에 따라 survivor의 빈공간으로 이동하거나 회수됨. (Minor GC)
Minor
Tenured
위 단계에서 또 참조정도에 따라 이동되게 되는 공간. 이 영역에서 데이터 허용치가 초과되면, 이 영역에 있는 모든 객체를 검사하여 한꺼번에 삭제한다.
Major
Permanent
= Merhod Area, java8 부터는 사라지고, 이 영역에 저장되던 데이터들은 heap, metaspace 영역으로 이동되었다.
X
metaspace - 운영체제가 관리하는 영역이므로 JVM이 관리하지 않아도 된다. 다 heap 영역으로 옮기면 되는거 아닌가 싶겠지만, 그렇게 하면 OutOfMemoryError 가 자주 발생될 수 있기 때문에 metaspace까지 사용한다.
스택영역
지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역
프로그램 실행 과정에서 임시로 할당되고, 끝나면 소멸되는 것들이 저장된다. - 생명주기가 매우 짧음.
기본타입 변수들(int, double 등)이 실제 값과 함께 저장
스택 메모리가 가득차면 자바에서는 java.lang.StackOverFlowError를 발생.
https://tv.kakao.com/v/426964287 - 코드 실행 상황 별 메모리 적재 상황 동영상
PC 레지스터
쓰레드가 생성될 때마다 생성되는 영역
현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있음
Native 메서드 스택
자바 이외의 언어(C, C++, 어셈블리 등)로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역
C/C++ 등의 코드를 수행하기 위한 스택
참고