Skip to content

Latest commit

 

History

History
63 lines (40 loc) · 3.35 KB

JVM.md

File metadata and controls

63 lines (40 loc) · 3.35 KB

JVM 메모리 구조

자바는 운영체제 종류, 플랫폼에 상관없이 독립적으로 실행할 수 있도록 해줍니다.

jvm은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당 받고, 용도에 따라 여러 영역으로 나누어 관리합니다. 총 5가지의 영역으로 나누어집니다.

메모리 구조를 알아야하는 이유

어플리케이션 코드의 성능이 뛰어나도 메모리 관리를 제대로 하지 않으면 어플리케이션의 성능이 떨어질 수 있습니다. 따라서 메모리 구조를 파악하고 한정된 메모리를 효율적으로 사용해야 합니다.

자바 실행 과정

Java Execution Process

Java Compoiler

Java Source 파일을 바이트 코드로 바꿔 .class 파일 생성

Class Loader

JVM내로 클래스 파일을 로드하고, 링크를 통해 배치 작업을 수행하는 모듈입니다. 런타임 시에 동적으로 클래스를 로드합니다.

Execution Engine

Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어 실행합니다. 최초 JVM이 나왔을 당시에는 인터프리터 방식으로 속도가 느리다는 단점이 있었지만, JIT 컴파일러 방식으로 단점을 보완했습니다.

JIT 는 바이트 코드를 어셈블러 같은 네이티브 코드로 바꿈으로써 실행이 빠릅니다.

Garbage Collector

힙 메모리 영역에 생성된 객체(인스턴스)의 생존여부를 판단해서 더 이상 참조되지 않는 객체의 메모리를 해제

Runtime Data Area

JVM의 메모리 영역 어플리케이션을 실행할 때 사용되는 데이터를 저장하는 영역.

Runtime Data Area

Method area

모든 쓰레드가 공유하는 메모리 영역입니다. 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관합니다.

해당 영역에 올라간 데이터는 프로그램의 시작부터 종료까지 메모리에 남아있어 프로그램이 종료될 때까지 어디서든지 사용이 가능합니다.

Heap area

  • 동적으로 생성된 객체(인스턴스)가 저장되는 공간이다.
  • 해당 영역에서 생성된 객체들은 다른 객체의 필드 또는 스택에 존재하는 다른 메서드에 의해 참조될 수 있다.

Heap area는 모든 쓰레드가 공유하며 객체의 실제 데이터가 담기는 공간입니다.

실제 데이터를 가지고 있는 Heap 영역의 참조값을 Stack 영역의 객체가 가집니다.

Stack area

  • 메소드가 호출될 때 실행되어 메모리가 할당되고, 종료되면 메모리에서 사라진다.
  • 지역 변수, 매개 변수를 영역에 할당한다.

변수의 주소를 Stack area에 저장하는 것이 아닌 heap 영역에 메모리를 할당하고 그 객체 데이터에 대한 참조값이 변수에 할당된다.

PC register

쓰레드가 시작할 때 생성될 때 동시에 생성되는 영역입니다. 쓰레드가 실행할 명령에 대한 기록을 하는 부분으로 현재 실행중인 JVM 주소를 저장합니다.

Native method stack

자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역입니다. Java Native Interface를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택입니다.