본문 바로가기
Language/자바&코틀린

[자바]JVM 구조 및 자바 메모리 구조

by 코딩공장공장장 2021. 1. 11.

JVM(Java Virtual Machine)

자바를 처음 공부할때 자바의 장점 중 하나인 플랫폼 독립성과 이를 나타내는 WORA를 들었던 기억이 있다.

 

Write Once Run Anywhere, 자바를 공부했던 사람이라면 누구나 책에서 봤을것이다.

 

운영체제나 CPU, 플랫폼에 상관없이 한번 쓰기만 하면 어디에서나 가능하게 해주는것이 바로 이 JVM이다.

 

Java Compiler가 JavaSource를 컴파일하면 바이트코드라는 기계어의 컴파일 파일을 만들고 이를 JVM이 실해하여

 

자바 소스가 어느 환경에서든지 잘 구동이 될수 있는것이다.

 

그럼 위의 이미지를 보며 JVM 구성요소에 대해 알아보겠습니다. 

 

- Class Loader : 클래스 로더는 컴파일러가 만든 클래스 파일을 JVM내의 메모리영역(Runtime Data Area)에 올리는

                      역할을 합니다. 이 과정은 런타임시 실행되지만, 필요한 과정이 있다면 계속해서 동작합니다.

 

- Garbage Collector :  가비지 컬렉터는 메모리 관리 기능을 자동으로 수행합니다. 애플리케이션이 생성한 객체의

                             생존 여부를 판단하여 사용되지 않는 객체를 해제하는 방식으로 메모리를 자동 관리합니다.

 

- Execution Engine : Class Loader를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드를 실행합니다.                                         이 때, Execution Engine은 자바 바이트 코드를 명령어 단위로 읽어서 실행합니다. 

 

- Runtime Data Area : JVM 메모리 영역이며 이 부분의 구조에 대해 하나씩 자세히 알아보겠습니다.

 

 

Runtime Data Area

 

JVM의 메모리 영역으로  메소드 영역, 힙 영역, 스택 영역, pc register, Native Method Area가 있는데요.

 

 

- Method Area : JVM에 의해 loading된 클래스들이 저장되며, 구현된 메소드, 상수들이 저장됩니다.

 

- Heap Area : new 연산자로 생성된 객체와 배열을 저장합니다. 주로 실행시간에 생성되는 객체를 저장하며

                 가비지 컬렉터에의해 관리되는 영역입니다.(중요한 영역)

 

- Stack Area : method가 호출될 때마다 스택 프레임이 생성. 이것이 쌓여 스택을 구성
                  컴파일시 size 및 life cycle이 정해짐
                  수행되는 method 정보, 지역변수, 매개변수, 연산 중 발생하는 임시데이터 저장
                  선입후출(FILO, First In Last Out) 구조로 push와 pop 기능 사용
                  본(원시)타입 변수는 스택 영역에 직접 값을 가진다.

                  참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.

 

- PC Register : 현재 수행 중인 JVM 명령 주소를 갖는다.

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

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

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

 

- Native Method Stack Area : 자바 외 언어로 작성된 네이티브 코드를 위한 Stack이다.

                                   즉, JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택이다. 

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

 

 

 

힙 영역

 

 

힙영역은 위와 같이 이루어집니다. 

 

Young Generation은 새로운 객체를 할당하기 위해 확보된 공간이며 Young Generation에서 가비지 컬렉터가

 

사용하지 않는 객체들 즉, 가비지들을 제거하고 그래도 객체가 가득차면 Old Generation 영역으로 보냅니다. 

 

Old Generation에는 당연히 Young Generation에서 살아남은 객체가 들어와 있죠. 

 

보통 Old 영역은 Young 영역보다 크게 할당되어 있으며 이러한 이유로 올드영역에서는 

 

가비지컬렉터가 young 영역보다 적게 발생합니다. 

 

참고로 Young Generation 영역에서는 마이너 가비지 컬렉션이 사용되고 Old Generation 영역에서는 

 

메이저 가비지 컬렉션이 사용됩니다. 

 

Young Generation의 Eden, From, To 에 대해 자세히 알아보겠습니다.

 

- Eden : 객체들이 최초로 생성되는 공간이며, new 연산자를 통해 생성된 객체가 위치하는 공간입니다. 

 

         정기적인 가비지 수집후 Eden 영역이 꽉차면 살아남은, 즉 라이프주기가 길다고 판단되는 객체가       

 

         From(survivor1) 또는 To(survivor2) 으로 이동됩니다.

 

- From(survivor1), To(survivor2) : Eden에서 참조되는 객체가 Eden이 꽉찼을때 이동되는 공간입니다.

 

 

 

마지막으로 설명을 안한 영역이 Permanent Generation영역인데 

 

Permanent는 클래스와 메소드 메타 정보가 저장되는 공간이다. static변수와 static메소드가 저장되는 공간이기도 하다.

 

이 영역은 java8부터 heap space는 아니라고 한다. native 메모리로 이동되었다고 한다. 

 

용어 또한 meta space로 바뀌었다.  

 

나 또한 실서버에서 permanet에 관한 정보를 찾지 못하여 당황했는데 metaspace로 바뀌었으니 참고하기 바란다.

 

 

 

 

 

참고자료  : 

hoonmaro.tistory.com/19

 

마로의 Java(자바) 정리 - 8. 자바 메모리 구조

JVM 구조 실행될 클래스 파일을 메모리에 로드 후 초기화 작업 수행 메소드와 클래스변수들을 해당 메모리 영역애 배치 클래스로드가 끝난 후 JVM은 main 메소드를 찾아 지역변수, 객체변수, 참조

hoonmaro.tistory.com

 

 

m.blog.naver.com/PostView.nhn?blogId=kywpcm&logNo=30170981872&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[Java memory] 자바 JVM 메모리 구조

1. Class Area (Method Area)- JVM의 모든 Thread들이 공유하는 데이터 영역으로 JVM이 시작될 ...

blog.naver.com

 

반응형