Language/Java

[Java] 실행 데이터 영역 (Runtime Data Area)

by Donghwan 2020. 12. 27.

자바 실행 데이터 영역 (Runtime Data Area)

Runtime Data Area는 JVM 이 프로그램을 수행하기 위해 할당 받는 메모리 영역이라고 할 수 있습니다. 실제 성능 문제에 직면했을 때, 대부분의 문제점은 Runtime Data Area에서 발생 하는 경우가 많습니다. Memory Leak 이나 Garbage Collection 인 경우를 그 예로 볼 수 있습니다 . 이러한 문제가 발생할 때, 이 문제가 왜 발생한 것인지 어디에서 발생한 것인지 확인하는 것은 쉽지 않습니다. 이 경우 Runtime Data Area 아키텍처를 이해한다면 해당 문제를 분석하는데 도움이 될 것입니다.

Runtime Data Area는 크게 다섯 가지 영역으로 나뉘게 됩니다 . 그것은 PC Register, Java Virtual Machine Stacks, Native Method Stacks, Method Area, Heap 입니다 . 각 Thread 별로 생기는 영역은 PC Register, Java Virtual Machine Stacks, Native Method Stacks 이고 , 모든 Thread가 공유하는 영역은 Method Area 와 Heap입니다 .

Method Area

Method Area는 JVM당 하나의 영역만 존재하며 또한 공유자원입니다. 클래스의 인스턴스가 생성된 후, 메소드가 실행되는 순간 클래스의 정보가 Method Area에 저장됩니다.

Method Area 는 내부에 Runtime Constant Pool 영역을 가지고 있습니다. Runtime Constant Pool 영역에는 클래스/인터페이스의 메소드, 필드, 문자열 상수등 레퍼런스가 저장되며, 이들의 물리적인 메모리 위치를 참조할 경우에 사용됩니다.

Heap Area

모든 인스턴스 오브젝트(클래스, 배열 등)가 저장되는 공간입니다. JVM당 하나의 영역만 존재하며 또한 공유자원입니다. 사용자가 관리하는 인스턴스가 생성되는 공간으로 객체를 동적으로 생성하면 인스턴스가 Heap 영역의 메모리에 할당됩니다. 프로그램은 시작될 때 미리 Heap 영역에 메모리를 할당해 놓으며 인스턴스와 인스턴스 변수가 저장된다. 레퍼런스 변수의 경우 Heap에 인스턴스가 저장 되는것이 아니라 포인터가 저장이 됩니다. Heap영역은 Garbage Collection의 대상이 되는 영역입니다.

Stack Area

각각의 스레드마다 개별의 스택영역이 존재합니다. 메소드를 호출할 때마다 프레임(Frame)을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다. 메소드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시 데이터를 저장합니다. Primitive 타입 변수는 스택 영역에 직접 값을 가집니다. 참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가집니다. 스택 영역은 공유자원이 아니기 때문에 스레드에 안전합니다.

PC Register

Java의 PC Register는 CPU 내의 기억장치인 레지스터와는 다르게 작동합니다 . Register-Base가 아닌 Stack-Base로 동작합니다. PC Register는 각 Thread 별로 하나 씩 존재하며 현재 수행 중인 Java Virtual Machine Instruction의 주소를 가지게 됩니다. 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역입니다. 이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있게 합니다.

Native Method Stack

자바 언어 이외의 언어로 작성된 코드를 저장하는 메모리 영역입니다. 주로 native 키워드가 붙은 애들이 저장됩니다.

728x90
반응형

'Language > Java' 카테고리의 다른 글

[Java] 제네릭 (Generic)  (0) 2021.04.21
[Java] 다형성  (0) 2021.01.01
[Java] 자바 클래스 로더  (0) 2020.12.26
[Java] 자바란? ( Java )  (0) 2020.12.25
[Java] JVM Architecture  (0) 2020.06.07

댓글