kiwi

자바의 메모리 구조

by 키위먹고싶다

RumtimeDataArea영역은 MethodArea와 heap, Stack, PC Register, Native Method Stack으로 이루어져있는데

Method AreaHeap영역은 모든 스레드가 공유하지만 Stack, PC Register, Native Method Stack는 스레드마다 하나씩 생성되는 공간이다. 

RuntimeDataArea

 

 

[Method Area]

method영역은 JVM이 시작될 때 생성되는 공간으로 *바이트코드가 이 영역에 저장된다.

이 공간은 모든 쓰레드가 공유하는 공간이므로 클래스와 변수의 정보, static키워드로 생성된 공유 변수가 저장된다. 

*바이트코드 : .java파일의 코드가 자바컴파일러(javac)를 통해 .class파일로 변경되고 바이트 코드가 생성된다.

 

[Heap]

Heap영역은 동적으로 생성된 객체가 저장되는 영역이다. new 연산자를 통해서 동적으로 생성된 인스턴스 변수가 저장된다.  new 연산을 통해서 생성된 데이터들 예를 들어 클래스의 객체나 배열등은 해당 객체가 소멸되기 전이나 GC가 사용되기 전까지 데이터들이 남아 있다. 쉽게 소멸되는 데이터가 아니다. Heap은 GC의 대상이 된다. 

 

 

[Stack]

Stack영역은 지역변수나 메서드의 매개변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는 영역이다. 메서드의 호출이 종료되면, 이 안에 선언된 변수들은 사라진다. 금방 사용되고 사용이 끝나는 데이터가 저장되는 영역이다.

왜 오른쪽 new연산자를 사용한 객체를 Stack에 넣지 않고 Heap에 넣을까? 그 이유는 저 객체가 필요할 때마다 생성해서 Stack에 넣었다 뺏다 하는것보다 실제 주소는 Heap에 넣어 관리하고 그 주소를 참조하는 참조 변수 p를 Stack에 넣어 관리하면 효율적이기 때문이다. 

 

[PC Register]

PC Register는 우리가 아는 일반적인 컴퓨터를 얘기하는것이 아니다. cpu레지스터 안에 있는 다음에 실행될 명령어의 주소를 저장하는 공간이 아니라 스레드가 시작될 때 생성되며, 현재 수행중인 JVM명령어 주소를 저장하는 공간이다. 결론은 스레드가 어떤 부분을 어떤 명령어로 수행할지를 저장하는 공간이다. 

 

 

[Native Method Stack]

이 영역은 JAVA가 아닌 다른 언어로 작성된 코드를 위한 공간이다. JNI(Java Native Interface)을 통해 호출하는 C/C++등의 코드를 수행하기 위한 공간이다. 바이트코드가 아닌 실제 실행 할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다. 

 

 

이제 RuntimeDataArea 에 로딩된 클래스 파일이 Execution Engine을 통해 해석될 차례이다. 이때 바이트코드를 기계어로 변환한다. 이제 기계어로 해석된 것들이 RumtimeDataArea에 배치된다. 

 

 

[Native Method Interface]

JVM에 의해 실행되는 코드 중 네이티브로 실행하는 것이 있다면, 해당 네이티브 코드를 호출하거나 호출 될 수 있도록 만든 일종의 프레임워크이다. 

 

[Native Method Librarise]

네이티브 메소드 실행에 필요한 라이브러리

'java' 카테고리의 다른 글

[java] concurrent package 정리  (0) 2022.08.19
자바 동기화 클래스  (0) 2022.06.28
가비지컬렉터(Garbage Collector)  (0) 2022.02.05
JVM 클래스로더  (0) 2022.01.22
자바의 실행과정(JVM,JIT)  (1) 2022.01.15

블로그의 정보

kiwi

키위먹고싶다

활동하기