[자바]Runtime Data Area

allnight5·2022년 11월 30일
0

자바 개념정리

목록 보기
16/28

OS가 JVM에 할당해준 메모리 영역을 Runtime Data Area라고 부른다.
그리고 이러한 메모리 영역은 우선 크게 두 가지로 나뉜다.
쓰레드 별로 생성되는 메모리 영역과 모든 쓰레드가 공유하는 메모리 영역이다.

---- 모든 쓰레드가 공유-----

  1. Method Area
  2. Heap

-------------------

--- 쓰레드 별로 별도생성-----

  1. Java Threads(Stack)
  2. Pc Registers(Program Counter Registers)
  3. Native Inernal Threads

---- 모든 쓰레드가 공유-----

1.Method Area(정적 멤버변수(static변수(==클래스변수)가 사용가능한 이유))

코드에서 사용되는 클래스 파일을 클래스로더로 읽어 클래스별로 런타임 상수풀, 필드 데이터, 메소드 데이터, 메소드 코드, 생성자 코드 등을 분류해서 저장한다.
이때 전역 변수와 정적 멤버 변수(static변수)는 이 영역에 저장되므로 프로그램이 시작부터 종료될 때까지 메모리 남아있게 되고, 이는 전역 변수가 프로그램 종료될 때까지 어디서든 사용이 가능한 이유가 된다.
저장하는 데이터
1. Type Information (타입 정보)
2. Runtime Constant Pool(런타임 상수 풀)(클래스 내의 final 제어자가 붙어있는 모든 상수들에 대한 symbol table을 관리(레퍼런스를 저장). 클래스 영역에 저장됨)
3. Field Information(필드정보) - Field modifier(필드 제어자), Filed Type
4. Method Information(메서드 정보) - Constructor를 포함한 모든 메소드
5. Class Variable(클래스 변수) - static키워드로 선언된 변수

# 1-1. Runtime Constant Pool (런타임 상수 풀)
Method Area에 포함되며 클래스 파일 Constant_pool 테이블에 해당하는 영역이다.
- Type, Field, Method로의 모든 레퍼런스를 저장
- JVM은 Runtime Constant Pool을 통해 실제 메모리상 주소를 찾아 참조한다.

2.Heap

JVM이 관리하는 프로그램에서 데이터를 저장하기 위해 런타임시 동적으로 할당하여 사용하는 영역
New연산자로 생성된 객체, 인스턴스와 배열을 저장한다.
힙 영역에 생성된 객체, 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
참조하는 변수나 필드가 없으면 GC(가비지 콜렉터)의 대상이 된다.
영역 5가지
1.Eden (Young Generation) : 객체가 처음에 저장되는 공간, 공간이 꽉차면 Minor GC에 의해 삭제
2.Survivor 1 & 2 (Young Generation) : Eden에서 살아남은 데이터가 옮겨진다. 공간이 부족하면 쓸모 없는 데이터는 Minor GC에 의해 삭제 되고 Old로 데이터를 보낸다.
3. Old (tenured generation) : Young Generation에서 살아남은 객체가 저장되는 곳이다. 이곳은 굉장히 오래사용하고 크기가 큰 객체가 대부분이다. 그리고 이 Old의 공간이 꽉 차게 되면 Minor가 아닌 Major GC가 실행된다.
Major GC는 객체들이 살아있는 여부를 파악하기 위해 모든 쓰레드의 실행을 멈추고 heap을 대대적으로 정리한다. 이 과정에서 Minor에 비해 자원, 시간을 많이 소모한다.
4. Permanent : 해당 영역은 보통 Class의 meta정보, method의 meta정보,static 변수와 상수 정보들이 저장되는 공간이었다. JDK 8버전부터 삭제되었다. 현재는 해당 기능을 Meta Spatce영역이 되어 Native 메모리 영역으로 관리가 넘어갔으나 Static Object는 Heap 영역으로 옮겨졌다.

Meta Spatce영역 참조

--- 쓰레드 별로 별도생성-----

쓰레드가 생성될 때 메모리 영역이 같이 생성되며, 쓰레드 종료되면 해제가 됨.

3. Java Threads(Java Stack, JVM Stack)

Thread 의 Method 가 호출될 때의 수행 정보와 같은 StackFrame 의 정보, 메서드 호출 주소, 매개변수, 지역변수와 같은 수행 정보를 나타낸다.

특징

1) 정적 메모리의 할당과
2) 쓰레드의 실행을 위한 값들을 저장하기 위해 필요한 공간
3) Method 영역과 달리 메서드 영역 밖에서는 사용할 수 없는 것이다.
자바에서 메서드를 호출할 때 메서드의 Stack Frame이 저장되는 영역.

과정

(1) 자바는 스레드를 생성하지 않았다면 main 스레드만 존재하고 그에 따라 stack frame도 한개만 있다.
(2) 그 과정에서 메서드를 호출하면 stack프레임을 하나 새로 생성(push)된다.
(3) 그리고 그 안에 메서드와 관계된 지역변수, 매개변수 등을 스택 영역에 저장한다.
(4) 이렇게 스택 영역은 메소드의 호출과 함께 할당되고 메소드의 호출이 완료되면 소멸(pop)한다.

Stack영역에 저장되는 변수들

1.기본자료형(int, double, long, float)
2.참조 자료형(기본 자료형 제외한 나머지) :실제 데이터가 아닌 참조값 즉 실제 데이터의 주소값을 가지는 것이다. 실제 데이터는 Heap영역에 존재한다.

4.Pc Registers(Program Counter Registers)

쓰레드가 하나씩 생성될 때 생기는 것으로 각 스레드마다 존재한다.
PC레지스터는 현재 실행중인 JVM의 명령 주소(Program Counter를 갖고 있는 영역이다.
CPU의 레지스터와는 별개로 Stack 내에서 작동하며, Native Stack을 실행할 땐 사용되지 않는다.

5.Native Inernal Threads(Native Method Stack)

Java 이외의 언어로 만들어진 코드들을 위한 Stack.
JNI(Java Native Interface)를 통해 호출되는 C / C++ 등의 코드를 수행하기 위한 Stack.
JVM 내부에 영향을 주지 않기 위해 따로 메모리 공간을 활용한다.

profile
공부기록하기

0개의 댓글