Java

JVM(Java Virtual Machine) / Heap / Stack

이진유진 2024. 1. 12. 13:31
반응형
velog에서 정리 한 것들을 블로그 이전하는 김에 다시 재정리를 하려고 한다. 

 

2023년 2월 13일 - https://velog.io/@yujin-17/TIL-07.-Java 

 

<TIL> 07. Java

*객체지향 언어(객체지향 언어의 중심에는 Class가 존재) -> Java는 클래스 없이 개발 불가능. 개발의 시작과 끝 모두 클래스에서 시작하고 클래스에서 끝난다.

velog.io

위의 글의 주제를 나눠서 지금 3번째 글 작성중이다.

 

전처리 과정의 이해

JRE는 Java의 실행환경이다. 

JRE는 프로그램 실행 전, 프로그램이 main Method를 포함하고 있는지 확인 후, 존재한다면 JVM을 부팅시긴다. 

부팅된 JVM은 전달받은 코드를 실행시키는데, 이때 가장 먼저 하는 일이 전처리 과정이다. 

 

전처리 과정

  • 모든 Java 프로그램은 반드시 java.lang 패키지를 포함한다. JRE는 해당 패키지를 Method Area에 배치시킨다. 
  • 프로그램을 사용하기위해 import 한 패키지들도 Method Area에 배치시킨다.
  • 프로그램 상의 작성한 모든 클래스, 변수, 메소드의 정보들도 Method Area에 배치시킨다. 
  • static(정적) 변수와 메서드는 Heap Area에 배치시킨다. 

 

Runtime Data Areas

컴퓨터에서 메모리와 같은 역할을 수행하는 영역이다. 

Java 프로그램을 실행하여 발생하는 데이터를 저장하는 역할이며, 데이터의 속성에 따라 영역이 분리되어있다. 

 

PC Register

  • Thread가 시작될 때마다 생성되는 공간이다. Thread마다 하나씩 존재한다. 
  • Thread가 어떤 명령에 의해 실행되어야 할지에 대한 기록을 하는 부분으로 현재 수행하고 있는 JVM의 명령 주소를 갖는다. 

Native Method Stack 

  • Java Program이 컴파일되어 생성되는 바이트 코드가 아닌, 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다. 
  • 자바 이외의 언어로 작성된 코드를 실행 시, Native Method Stack이 할당되며, 일반적인 C Stack을 사용한다.
  • Java Native Interface를 통하여 바이트 코드로 전환 후 저장한다. 
  • 일반 프로그램처럼 커널이 Stack을 잡아 독자적으로 프로그램을 실행시킨다. 

Method Area(Metaspace, Static Area, Class Area)

  • 클래스 정보를 처음 메모리 공간에 올릴 때, 초기화 되는 대상을 저장하기 위한 공간이다. 
  • 클래스의 타입, 변수 및 메서드 등의 정보를 가지고 있으며, 모든 Thread가 공유한다. 
  • Runtime Constant Pool - 상수 자료형을 저장하여 참조하고, 중복을 막는 역할을 수행한다. 

Heap Area

  • 객체(인스턴스)가 생성되는 역역이다. 
  • 프로그램을 실행하는 중에 생성되는 객체들은 이곳에 생성된다. 
Permanent Generation?

 

생성된 객체들 정보의 주소값이 저장되는 공간.

  • 클래스 로더에 의하여 로드되는 Class와 Method 등에 대한 메타 정보가 저장되는 영역. JVM에 의하여 사용된다.
  • Reflection을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다. 
  • Java 8 이전에는 Permanent Generation이 Heap 내부에 존재하였지만, 8 이후에는 제거가 된 후 Method Area. 즉, Metaspace라 불리는 Native 메모리에 저장이된다. 
  • 이전 제한한 메모리 크기로 인해 발생한 한계점을 극복하기 위해서 이렇게 변경되었다. 
New/Young Generation

 

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

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

생명주기가 짧은 객체들을 Garbage Collector로 Eden 영역에 있는 값들을 Survivor 1 영역에 복사하고, 이 영역을 제외한 나머지 객체들을 삭제한다. 

 

Tenured Generation

 

Old : 이곳의 객체들은 Garbage Collector에 의하여 삭제된다.

  • New/Young Generation에서 일정시간 참조되고 있고, 살아남은 객체들이 저장되는 공간이다. 
  • 생명주기가 긴 객체를 Garbage Collector의 대상으로 하는 영역이다. 

Stack Area

  • 프로그램 실행 과정에서 임시로 할당이 되었다가, 메소드를 빠져나갈 시 바로 소멸이 되는 특성의 데이터를 저장하기 위한 영역이다.
  • 실행되는 메소드 및 중괄호 블록(if문)에 대한 데이터가 저장이된다. 
  • 가장 처음 실행되는 메소드(main())가 첫번째로 메모리에 올라가고, 차례로 다음 메소드들이 위에 쌓이는 구조이다. 
  • 쌓이는 메소드의 단위 = Stack Frame
  • 해당 메소드를 실행하기 위한 변수 및 블록이 존재하면, Stack Frame 내부에 Stack Frame이 생길 수 있다. 
  • 가장 큰 특징은 멀티 스레드 환경에서 각 스레드가 고유의 스택 영역을 가진다는 것이다. 

Process?
실행중인 프로그램을 의미한다. 
사용자가 작성한 프로그램이 운영체제에 의하여 메모리 공간을 할당받고 실행 중인 것을 의미한다. 
프로세스는 프로그램에서 사용되는 Memory 등의 자원과 Thread로 구성된다. 

Thread?
프로세스 내부에서 실제로 작업을 수행하고 있는 주체이다. 
2개 이상의 Thread를 가진 프로세스는 Multi-Threaded Process 이다. 

Reflection? 
객체를 통해 클래스의 정보를 분석하는 프로그래밍 기법이다. 
구체적인 클래스 타입을 알지 못해도, 컴파일된 바이트 코드를 통해 역으로 클래스 정보를 알아내어 사용할 수 있다. 
반응형