자바 메모리 구조

이규훈·2023년 6월 3일

자바의 메모리 관리는 런타임 중 동적으로 이루어집니다. 각각의 메모리 영역은 서로 다른 용도와 생명주기를 가지고 있습니다.

런타임?
"런타임(runtime)"은 프로그램이 실행되고 있는 동안을 의미합니다. 즉, 프로그램이 시작하여 종료될 때까지의 시간 동안을 가리킵니다.

Heap

객체와 클래스 인스턴스가 Heap 영역에 할당됩니다. 즉, new 키워드로 생성되는 모든 객체는 이곳에 위치합니다.


Heap 영역은 크게 'Young Generation', 'Old Generation', 'Permanent Generation'으로 나뉩니다.
'Young Generation'은 새로 생성된 객체들이 위치하는 공간입니다. 'Young Generation'은 다시 'Eden Space'와 'Survivor Space'로 나뉩니다. 대부분의 객체는 'Eden Space'에서 생성되고, 살아남은 객체들은 'Survivor Space'로 이동합니다.
객체가 일정 시간 이상 'Survivor Space'에 머무르면 'Old Generation'으로 이동하게 됩니다. 이는 오랫동안 살아남은 객체, 즉 'Long Lived Objects'로 분류됩니다.
'Permanent Generation'에는 클래스나 메소드와 같은 자바 런타임에 필요한 메타데이터 정보가 저장됩니다.

이 부분은 저도 이해가 잘 안가서 좀 더 조사하고 다시 상세하게 포스팅하겠습니다.


Stack

Stack 영역은 특정 쓰레드가 메소드를 실행하는데 메모리를 제공합니다. 각 메소드 호출마다 가각각의 스텍 프레임이 생성됩니다.

스택 프레임?
스택 프레임(Stack Frame)은 컴퓨터 프로그램의 서브루틴 호출에서 호출자와 피호출자 사이에 정보를 전달하는 데이터 구조입니다. 일반적으로 스택 프레임은 스택에 푸시되며, 서브루틴이 반환 될때 스택에서 팝됩니다. 한 스택 프레임은 해당 서브 루틴의 실행 상태를 포함하며, 이는 전달된 매개변수, 로컬 변수, 반환 주소, 그리고 프레임이 푸시되기전의 스택 프레임에 대한 정보등이 포함될 수 있습니다.

서브 루틴?

서브루틴(subroutine)은 컴퓨터 프로그래밍에서 일련의 명령어들을 담고 있는 코드 블록을 가리키는 용어입니다. 이 코드 블록은 특정한 작업을 수행하며, 그 작업을 여러 번 혹은 여러 곳에서 재사용하려는 목적으로 만들어집니다.

서브루틴은 보통 입력(인자 또는 매개변수)를 받아들이고, 결과를 출력(반환값)합니다. 그러나 필수적인 것은 아닙니다. 함수, 메소드, 프로시저 등의 이름으로도 불립니다.

서브루틴의 장점은 아래와 같습니다:

코드의 재사용: 같은 코드 블록을 여러 번 작성할 필요 없이 서브루틴을 호출하면 됩니다.
코드의 모듈화: 프로그램의 복잡도를 관리하기 위해 작업을 작은 부분으로 분할하는데 도움이 됩니다.
코드의 가독성: 잘 이름 붙여진 서브루틴은 프로그램의 전체적인 흐름을 이해하는데 도움이 됩니다.
예를 들어, 특정 배열에서 가장 큰 값을 찾는 서브루틴을 만들 수 있습니다. 이 서브루틴은 배열을 입력으로 받아들이고, 배열의 가장 큰 값을 반환합니다. 이 서브루틴은 프로그램 내의 어디서든 호출할 수 있으며, 이로써 코드의 재사용성과 가독성을 향상시킬 수 있습니다.

스택 프레임은 메소드의 지역 변수, 매개변수, 리턴 값, 연산 중 발생하는 임시 데이터 등을 저장합니다.
메소드의 호출이 완료되면 해당 스택 프레임은 스택에서 팝되어 제거되고, 이 메모리는 자동으로 반환됩니다.

Method Area

Method Area는 클래스 정보, 상수, static 변수, 즉 컴파일 타임에 알 수 있는 데이터를 저장합니다.

컴파일 타임?
컴파일 타임(Compile time)은 프로그램의 소스 코드가 컴파일러에 의해 기계어로 변환되는 시간을 말합니다.

또한 JVM에 의해 사용된 바이트 코드도 이곳에 위치합니다.

바이트 코드?
바이트코드(Bytecode)는 특정 하드웨어가 아닌 가상 머신에서 실행되도록 설계된 이진 코드입니다. 자바에서 소스코드 (.java파일)은 컴파일러에 의해 바이트코드(.class)로 변환됩니다.
이 바이트 코드는 자바 가상 머신에서 해석되어 실행됩니다.

모든 쓰레드가 공유하는 메모리 영역입니다.

쓰레드?
쓰레드는 프로세스 내에서 실제로 작업을 수행하는 주체입니다. 하나의 프로세스는 한 개 이상의 쓰레드를 가질 수 있으며, 이러한 쓰레드들은 동시에 실행 될 수 있습니다.

PC Registers

PC(Register Program Counter)는 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장합니다. 이것은 현재 실행되는 JVM 명령의 주소를 가지고 있습니다.

Native Method Stacks

자바 외부의 네이티브 메소드 정보를 저장하는 영역입니다. 자바 네이티브 인터페이스(JNI)에 의해 호출되는 C/C++ 등의 코드 정보를 가지고 있습니다.

네이티브 메소드?
네이티브 메소드란 자바가 아닌 다른 언어(C나 C++ 등)로 작성된 함수를 의미합니다. 자바에서는 이러한 네이티브 메소드를 JNI(Java Native Interface)를 통해 호출하게 됩니다.

JNI?
JNI는 자바가 아닌 다른 프로그램이 언어로 작성된 함수를 자바 코드에서 호출하거나, 자바 메서드를 다른 언어의 코드에서 호출할 수 있도록 하는 프로그래밍 프레임워크입니다.
JNI를 통해서 C, C++와 같은 네이티브 프로그래밍 언어로 작성된 코드를 사용할 수 있게 됩니다. 이는 자바가 제공하는 기능 밖에 있는 시스템 수준의 라이브러리나 운영체제 기능을 사용하거나, 성능이 중요한 연산을 보다 빠르게 처리하기 위해 필요한 경우가 많습니다. 또한 이미 C, C++로 작성된 기존의 라이브러리를 자바에서 활용할 수 있게 합니다.

profile
개발취준생

0개의 댓글