개발/Java

[Java] 자바 JVM 메모리 구조

hojak99 2015. 11. 3. 14:33

JVM이 사용하는 메모리 영역

 

프로그램이 실행되면, JVMOS으로부터 이 프로그램이 필요로 하는 메모리를 할당받고, JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

 



 

Runtime Data Area : JVM이 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 영역

 

Runtime Data Area 에는 크게 다섯 가지 영역으로 나뉘게 된다.

바로 PC Register, Java Virtual Machine Stacks, Native Method Stacks, Method Area, Heap 이다.

각 쓰레드 별로 생기는 영역은 PC Register, Java Virtual Machine Stacks, Native Method Stacks 이고, 모든 쓰레드가 공유하는 영역은 Method Area Heap 이다.

 

 

PC Register

 

Java PC Register CPU 내의 기억장치인 레지스터와는 다르게 작동하며

Stack-Base 로 동작한다. PC Register 은 각 쓰레드 별로 하나씩 존재하며 현재 수행 중인

Java Virtual Machine Instruction 의 주소를 가지게 된다. 만일 Native Method를 수행 한다면 PC RegisterUndefined 상태가 된다. 만약 Native Method를 수행할 때에는 JVM을 거치지 않고 API를 통해 바로 수행하게 된다.(Java 는 플랫폼에 종속 받지 않는다는 것을 보여줌), 쓰레드가 생성 될 때마다 생성되는 공간, 쓰레드가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록, 현재 실행되는 부분의 명령과 주소를 저장

------

Java Virtual Machine Stacks

 

Java Virtual Machine Stacks 은 쓰레드의 수행 정보를 Frame을 통해서 저장하게 된다.

Java Virtual Machine Stacks 은 쓰레드가 시작될 때 생성되며, 각 쓰레드 별로 생성이 되기 때문에 다른 쓰레드는 접근할 수 없다. Java Virtual Machine Stacks에서 현재 수행하고 있는 FrameCurrent Frame 이라고 한다.

 

*Frame Data

 

Stack Frame을 구성하는 영역인데 이 곳에서는 Constant Pool Resolution 정보와 메소드가 정상 종료 했을 때의 정보 또는 비정상 종료를 했을 때 발생하는 Exception 정보를 저장한다. Resolution이란 Symbolic ReferenceJVM에서 실제 접근할 수 있는 Direct Reference로 변경하는 것을 말한다.

------

 

Native Method Stacks

 

JVMNative Method를 위해 Native Method Stack이라는 메모리 공간을 가진다. Applicantion에서 Native Method를 호출하게 되면 Native Method Stack 에 새로운 Stack Frame을 생성하여 Push 한다. 이는 JNI를 이용해 JVM 내부에 영향을 주지 않기 위함이다.

Native Method 의 수행이 끝나면 해당 메쏘드를 호출한 Stack Frame 이 아닌 새로운 Stack Frame를 하나 생성하여 작업 수행한다. 자바 외에 다른 언어에서 제공되는 메서드들이 저장되는 공간

------

 

Method Area

 

Method Area 는 모든 쓰레드가 공유하는 메모리 영역이다. Method Area 는 클래스와 Interface Bytecode 및 메타 데이터가 저장이 된다. 이는 Garbage Collection 의 대상이 된다.

------

 

Java Heap

 

.Java Heap에서 많은 성능 이슈가 발생하는데 Gabage Collection 에 의한 것이 대표적인 예이다. Java HeapInstanceArray 객체 두 종류가 저장되는 공간이다. Java Heap은 모 든 Thread에 의해 공유된다고 했는데 그로 인해 동기화 문제가 발생할 수 있다. Java HeapGabage Collection 에 의해 메모리 해제 작업은 필요하지 않다. new 연산자로 생성된 객체와 배열을 저장하는 공간, 클래스 영역에 로드된 클래스만 생성가능, Garbage Collector를 통해 메모리 반환

 

 

*번외*

*Hotspot JVM IBM JVM Object 의 구조

 

-Object 구조

Heap 에 저장되는 Object Array 객체는 HeadData 로 나뉘게 된다.

 

-Hotspot Object 구조

Hotspot JVM Object 의 경우 두 개의 Header를 가지고 있고, Array 객체의 경우 세 개의 Header를 갖는다. First headerGabage CollectionSyncronization 작업을 위해 사용한다. 두 번째 Header에는 Method AreaClass 정보를 가리키는 Reference 정보가 저장 된다. Array의 경우 세 번째 Header가 존재하게 되는데 Array Size 정보를 갖기 위한 공간이다.

 

 

 

-IBM Object 구조

IBM JVM Java 5의 경우를 살펴보겠다. Object 의 경우 2개의 Header를 가지고 Array의 경우 Array Size 정보를 담고 있는 Header를 포함해 총 3개의 Header 가지게 된다.

첫 번째 Header Vtable Object Information 에 대한 Vtable Pointer를 가지고 있고 주로 Garbage Collector 에 의해 사용된다. 두 번째 Header Lock Word를 이용해 Object Lock 획득 유무를 확인하기 위해 사용된다.

 

 

*Heap 의 구조

 

- Hotspot JVM Heap 구조

Hotspot JVM Heap 의 가장 큰 특징은 Young Generation Old Generation 으로 나뉘어 진다는 것이다. Young GenerationEdenSurvivor 영역으로 구성되어 있고 최초 Heap에 객체가 할당되 는 곳은 Eden이다. 그 이후 Object 참조 여부를 확인해서 참조가 되어 있는 상태면 Survivor 영역으로 넘기고 오래 살아 남으면 Old 영역으로 이동시킨다. 이를 Promotion이라고 한다

 

- IBM JVM Heap 구조

IBM JVM Heap은 버전에 따라 다른 모습을 보이고 있다. 먼저 IBM JVM 1.4를 살펴보도록 하 겠다. 1.4 버전의 대표적 특징은 One-Heap이라는 점이다.

------

 

 


int[] scores = { 10, 20, 30 }; 이 문장이 실행될 때의 메모리 사용에 대해 구체적으로 설명

 

scores 의 값은 스택에 저장된다. 또한 동적메모리 할당 연산자로 선언되었기 때문에 값이 아니라 주소가 저장된다. 그리고 실제 데이터 값은 힙(heep)에 저장이 된다.

자바에서는 배열을 생성했을 때 배열의 크기(마지막지점)을 알고 있는데 그 값을 찾아보려면 scores.length를 출력하면 된다.

 


 향상된 for

int[] scores = { 83, 90, 87 }

int sum;’

 

for(int i : arr){

sum += scores[i];

}

 

이것이 바로 향상된 for 문입니다.

 

먼저 배열을 선언하고 값을 초기화합니다.

그리고 sum이란 변수를 선언한 뒤,

for(자료형 변수명 : 배열)을 사용하면 배열의 값이 차례대로 : 앞의 변수명에 대입되면서 반복한다. 그리고 scores[i] 의 값을 sum에 저장~

 

 



 

 

 

 

반응형