OPEN between Secret

JVM 메모리 구조 본문

T.N.V/c & java & 변수

JVM 메모리 구조

해가꿈꾸는달 2017. 11. 23. 01:38
반응형

Class Loader : Class파일을 메모리(Runtime Data Area)에 적재한다.

- Bootstrap 클래스로더 : JRE의 클래스들

- Extension 클래스로더 : JRE의 확장라이브러리

- System 클래스로더 : 시스템환경변수의 클래스패스

Execution Engine : byte code를 실행 가능하게 해석해주는 기능

RunTime Data Area : 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간

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

- JVM은 프로그램 실행중에 사용되는 다양한 런타임 데이터 영역을 정의함

- 이런 데이터 영역 중 일부는 JVM 시작시 생성되며 JAVA 가상 스시틈이 종료 될 때만 파괴된다.

- 다른 데이터 영역은 per-thread 다.

- per-thread 데이터 영역은 스레드가 생성될때 같이 생성되며, 스레드가 종료 될때 같이 파괴된다.



1. Method Area 

- 동의어 : Class Area, Code Area, Static Area

- JVM이 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 생성자와 메소드를 저장하는 공간

- java 코드가 자바 컴파일러에 의해 변경된 class 파일의 바이트 코드가 로드되는곳.

- 2개의 주요 공간으로 불리된다

- Permanent Generation

- 클래스 정의, 구조, 메소드, 필드, 메소드 (데이터 및 코드) 및 상수로 부터 클래스 관련
    데이터 저장

- Code Cache

- 캐시 영역은 컴파일 된 코드를 저장하는데 사용

- 컴파일 된 코드는 원시코드일 뿐이며, Oracle HotSpot JVM에 고유한 JIT컴파일러가 처리

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

Oracle 제공 JVM 사양

- JVM에는 모든 JVM 스레드 간에 공유되는 메소드 영역이 있음

- 메소드 영역은 기존 언어으 ㅣ컴파일 된 코드 또는 운영체제 프로세스의 '텍스트' 세그먼트와 유사한 저장영역과 비슷

- 클래스 및 인터페이스 초기화 및 인스턴스 초기화에서 사용되는 특수 메서드를 포함하여 런타임 상수풀, 필드 및 메서드 데이터, 메서드 및 생성자 코드와 같은 클래스 별 구조를 저장

- 가상 컴퓨터 시작시 만들어짐

- 논리적으로는 heap의 일부이지만 단순 구현에선느 가비지 수집 또는 압축을 선택하지 않을 수 있음

- 메소드 영역의 위치나 컴파일 된 코드를 관리하는 데 사용되는 정책을 요구하지 않음

- 메소드 영역은 고정 도니 크기 일 수 있고, 계산에 필요한 만큼 확장 될 수도 있으며 큰 메소드 영역이 불필요 해지면 축소 될 수 있음

- 메소드영역의 메모리는 인접하지 않아도 됨

2. Stack

- LIFO(Last In First Out)

- 메소드 호출 시마다 각각의 스택프레임(그 메서드만을 위한 공간)이 생성

- 메서드 안에서 사용되어지는 값을 저장, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장

- 메서드 수행이 끝나면 프레임별로 삭제

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

oracle 제공 JVM 사양의 stack

- JVM 스레드는 스레드와 동시에 작성된 비공개 jvm stack을 갖는다.

- 프레임을 저장한다

- C와 같은 기존 언어의 스택과 유사하다.

- 로컬 변수, 부분 결과를 저장하고, 메소드 호출 및 반환에 일부 역할을 함.

- 프레임을 push/pop 하는 경우를 제외하고 절대로 직접 조작되지 않으므로 프레임은 힙에 할당될 수 있다.

- 스택 메모리는 연속적일 필요가 없다.

- JVM 사양 초판에는 JVM stack 은 Java stack 으로 알려져 있음

- 고정 크기이거나 계산에 필요한만큼 동적으로 확장 및 축소 될 수 있도록 함

- 스택의 크기가 고정 된 경우 스택 작성시 각 스택의 크기를 독립적으로 선택할 수 있음

- 스택은 초기 크기를 제어 할 수 있을뿐만 아니라 동적으로 확장 또는 축소하는 경우 최대 및 최소 크기를 제어할 수 있다

3. Heap

- new 연산자로 생성된 객체와 배열을 저장하는 공간

- 클래스 영역에 로드된 클래스만 생성가능

- Garbage Collector를 통해 메모리 반환

- Permanent Generation : 생성된 객체들의 정보와 주소 값이 저장된 공간

- New Area

- Eden : 객체들이 최초로 생성되는 공간

- Survivor : Eden에서 참조되는 객체들이 저장되는 공간

- Old Area : New Area에서 일정시간이상 참조되고 있는 객체들이 저장되는 공간

- 모든 스레드가 공유되는 저장소

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

oracle 제공 JVM 사양의 heap

-JVM에는 모든 JVM 스레드간 공유되는 heap이 있다.

- heap은 모든 클래스 인스턴스 및 배열에 대한 메모리가 할당되는 런타임 데이터 영역임

- 가상 시스템 시작시 생성

- 객체의 heap 스토리지는 자동 스토리지 관리 시스템(garbage collector)에 의해 교정됨

- 객체는 명시적으로 할당이 해제되지 않는다.

- JVM은 특정 유형의 자동 스토리지 관리 시스템을 가정하지 않으며 스토리지 관리 기술은 구현자의 시스템 요구 사항에 따라 변함

- 힙은 고정된 크기 일 수도 있고 계산에 따라 확장 될 수도 있으며 더 큰 힙이 불필요 해지면 축소 될 수 있습니다.

 - 힙의 메모리는 연속적일 필요는 없다.

- JVM 구현은 힙의 초기 크기에 대한 프로그래머 또는 사용자 제어를 제공할 수 있을뿐 아니라 힙을 동적으로 확장 또는 축소 할 수 있는 경우 최대 및 최소 힙 크기를 제어 할 수 있음

4. Native Method

- JNI(Java Native Interface)를 통해 호출되는 c/c++등의 코드를 수행하기 위한 스택

- 네이티브 메소드의 매개변수, 지역변수 등을 바이트 코드로 저장

- 자바 외의 다른 언어에서 제공되는 메서드들이 저장되는 공간

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

Oracle JVM 사양 제공

- java 가상 머신의 구현에서는, Native Method(java 프로그램 언어 이외의 언어로 기술된 메소드)를 지원하기 위해서 구어체로  [c 스택]이라고 불리는 통상의 스택을 사용할 수 있음

- C와 같은 언어로 설정된 JVM의 명령어 세트에 대한 인터프리터 구현에 의해 사용될 수 있음

- Native Method로 할 수 없고 자체적으로 기존 스택에 의존하지 않는 JVM 구현은 네이티브 메소드를 제공할 필요가 없습니다.

5. PC Register

- 현재 수행 중인 JVM 명령 주소를 갖음

- 프로그램 실행은 CPU에서 인스트럭션(Instruction)을 수행

- CPU는 인트스럭션을 수행하는 동안 필요한 정보를 CPU 내 기억장치인 레지스터에 저장

- 연산 결과값을 메모리에 전달하기 전 저장하는 CPU 내의 기억장치

- Thread가 생성 될 때마다 생성되는 공간

- Thread가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록

- 현재 실해오디는 부분의 명령과 주소를 저장

- 명령어의 주소를 저장 = 하드웨어의 PC

-------------------------------------------------------------------------------------------------------------oracle 제공 JVM 사양의 PC register

-  JVM은 많은 thread를 동시에 지원할 수 있다.

- 각각의 JVM thread는 자기의 PC Register를 갖는다.  어느시점에는 각 JVM thread는 단일 메소드 코드, 즉 해당 스레드에 대한 현재 메소드를 실행중이다.

- 그 메소드가 native가 아닌경우, pc register에는 현재 실행중인 JVM 명령어의 주소가 포함된다. 현재 실행중인 메소드가 native라면 jvm의 pc register값은 정의되지 않는다?

- JVM의 pc register는 returnaddress나 특정플랫폼의 native pointer를 보유할만큼 충분히 넓다

!! 모르는 단어

런타임 상수 풀 

- 클래스 파일의 constant_pool 테이블에 대한 클래스별 또는 인터페이스 별 런타임 표현

- 컴파일 타임에 알려진 숫자 리터럴과 런타임에 해석되어야하는 메서드 및 필드 참조에 이르는 여러 종류의 상수가 포함

- 일반적인 프로그래밍 언어의 심볼 테이블고 ㅏ유샇나 기능을 제공하지만 일반적인 심볼 테이블보다 더 넓은 범위의 데이터를 포함

- 각 런타임 상수 풀은 jvm 메소드 영역에서 할당

- jvm에 의해 클래스 또는 인터페이스가 생성 될 때 클래스 또는 인터페이스의 런타임 상수 풀이 생성

멤버 변수 -

클래스  - 같은 종류의 집단에 속하는 속성(attribute)과 행위(behavior)를 정의한것. 객체지향 프로그램의 사용자 정의 데이터 형.

객체 - 클래스의 인스턴스 = 정의한것을 실제로 메모리에 할당하여 사용할수 있게 됨. 객체는 자신의 고유한 속성을 갖고 클래스에서 정의한 행위(behavior)를 수행할 수 있음. 객체의 행위는 클래스에서 정의한 행위를 공유함으로써 메모리를 경제적으로 사용함

메소드 - 클래스로부터 생성된 객체를 사용하는 방법으로, 객체의 명령을 내리는 메세지. 한 객체의 서브루틴 형태로 객체의 속성을 조작하는데 사용.

생성자 -

스택프레임 -

new 연산자 -

Garbage Collector - 

JNI -

인스트럭션(Instruction) -

Thread - 

네이티브 메소드스택 : C스택이나 C++의 라이브러리를 JNI로 사용할떄 해당 메소드를 실행하기 위한 영역

출처 : http://atin.tistory.com/625

반응형

'T.N.V > c & java & 변수' 카테고리의 다른 글

데이터 타입  (0) 2017.11.22
끄적끄적  (0) 2017.11.20
C언어 & Java  (0) 2017.11.17