Java (자바)

[Java] JVM 메모리 할당 방식 - Stack · Heap Memory

Oscar:) 2024. 3. 5. 06:19

 

 

 

지난 포스팅에서 JDK · JRE · JVM에 대해 간단히 알아보았다.

 

 

[Java] JDK · JRE · JVM

JDK · JRE · JVM에 대해 알아보자. JDK Java Development Kit Java로 프로그램을 개발하는데 필요한 툴을 모아놓은 소프트웨어 패키지다. JDK는 JRE, JVM을 포함하고 있다. 그렇기에 JDK를 설치하면 JRE · JVM이

oscarstory.tistory.com

 

 

이번 포스팅에서는 JVM을 조금만 더 공부해보려 하는데,

그 중에서 JVM의 메모리 할당 방식에 대해 알아보겠다.

 

 

 


 

 

 

JVM은 Stack Memory · Heap Memory라는 2가지 공간을 사용하여 메모리를 할당한다.

 

 

 

✅ Stack Memory

 

 

지난 포스팅을 보고 왔다면 알겠지만,

우리가 작성한 코드를 컴파일러가 바이트 코드로 컴파일 해준다고 언급했었다.

 

컴파일 된 바이트 코드는 한 줄씩 읽히며 Stack Memory에 쌓이게 된다.

 

 

 

간단한 예제와 그림을 보며 이해해 보자.

 

void main() {

    int numA = 5;
    int numB = 10;
    int numC = numA + numB;

}

 

 

위와 같은 코드가 있다면

Stack Memory는 다음 그림과 같다.

 

 

 

main() 메서드가 실행되면 Stack Memory에 차곡차곡 쌓이게 되고,

main() 메서드가 끝나면 모두 지워진다.

 

 

화살표로 이미 눈치챘을 수 있지만,

Stack Memory는 전형적인 LIFO 방식이다.

 

*Last In First Out : 늦게 들어온 게 먼저 나간다.

 

 

 


 

✅ Heap Memory

 

 

하지만 중요한 점은, Stack Memory는 모든 데이터를 저장할 수 없다는 것이다.

 

Stack Memory는 원시 타입 변수들만 저장한다. (int, double, boolean 등)

 

 

조금이라도 복잡한 변수라면 Heap Memory에게 일을 떠맡겨 버린다.

 

여기서 말하는 복잡한 변수란, 원시 타입이 아닌 변수들.

Class, String, Array 등과 같은 변수라고 생각하면 쉽다.

 

 

 

 

다음 예제와 그림을 보며 이해해보자.

 

void main() {

    String str = "Oscar";
    int[] array = {1, 2};
    Student student = new Student(1, 29);
    
}

 

 

위 코드의 3가지 변수는 모두 원시 타입이 아니다.

 

위와 같은 코드에서 Stack · Heap Memory는 다음과 같은 관계를 가진다.

 

 

 

Stack Memory에는 Heap Memory에 있는 해당 변수의 주소 값만 저장한다.

 

주소 값의 개념이 어렵다면 일반 주소처럼 생각하면 쉽다.

교동 81번지
Heap동 '주소 값'번지

 

 

결국은 Heap Memory에 실제 데이터가 저장되는 것이다.

 

 

 


 

✅ Heap Memory 내부 참조

 

 

그럼 다음과 같은 형식의 데이터는 어떻게 저장될까?

 

void main() {

    Student[] array = {new Student("Oscar", 29), new Student("Taron", 20)};

}

 

 

데이터 클래스 배열이며,

데이터 클래스는 String 변수를 가지고 있다고 가정한다.

 

 

 

위 그림 처럼 Heap Memory에 배열, 클래스, String 데이터가 나뉘고,

 

Heap 데이터가 다시 Heap 데이터를 참조하는 방식으로 적용된다.

 

 

 


 

 

 

 

이번 포스팅에서는 JVM의 메모리 할당 방식에 대해 알아보았다.

 

 

이론적인 내용은 역시 딱딱하지만,

조금씩 이해하다 보면 재밌는 것 같기도 하다.

 

 

'Java (자바)' 카테고리의 다른 글

[Java] Pair / 자료 구조 / 2개의 데이터 관리하기  (0) 2024.03.25
[Java] Garbage Collector  (0) 2024.03.06
[Java] JDK · JRE · JVM  (0) 2024.03.04
[Java] HashMap / 해시맵  (0) 2024.02.06
[Java] 확장 for문 / Collection  (0) 2024.02.05