본문 바로가기
개발공부/JAVA

[JAVA] 메모리 구조(Stack/Heap)

by 양히◡̈ 2022. 9. 21.

모든 자바 프로그램은 자바 가상 머신(JVM)을 통해서 실행된다.

자바 프로그램이 실행되면, JVM은 운영 체제로부터 해당 프로그램을 수행할 수 있도록 필요한 메모리를 할당받는다.

 

프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 3가지 있다.

image from TCP School

 


 

 

method 영역

자바 프로그램에서 사용되는 클래스에 대한 정보와 함께 클래스 변수(static variable)가 저장되는 영역으로,

JVM은 자바 프로그램에서 특정 클래스가 사용되면 해당 클래스의 클래스 파일(*.class)를 읽어들여, 해당 클래스에 대한 정보를 메소드 영역에 저장한다.

 

Stack 영역

자바 프로그램에서 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역으로, JVM은 자바 프로그램에서 메소드가 호출되면, 메소드의 호출과 관계되는 지역 변수와 매개변수를 스택 영역에 저장한다.

이렇게 스택 영역은 메소드의 호출과 함께 할당되며, 메소드의 호출이 완료되면 소멸한다.

스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다.

스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출된다.

스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.

 

Heap 영역

자바 프로그램에서 사용되는 모든 인스턴스 변수가 저장되는 영역이다.

JVM은 자바 프로그램에서 new 키워드를 사용하여 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장한다.

힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

 

 

 


 

 

Java String Pool

JVM이 메모리를 할당받을 때, String은 Heap영역에 쌓이게 된다고 했다.

String 객체를 new 연산자로 생성하게 되면, 생성할 때마다 각각 하나의 Heap 영역을 차지하게 되는데,

String 객체를 리터럴("")로 생성하면 Heap 영역 내 "String Constant Pool"에 저장되어 재사용이 가능하다.

 

따라서 효율적인 메모리 관리를 위해서는 String 객체를 생성할 때 literal 형식을 사용하는 것이 좋다고 한다.

 

 

 

 


Reference ▼

 

[JAVA] JAVA 메모리 이야기 - Stack 과 Heap

하이.. ! 어느날 회사의 누군가 Java의 메모리가 어떻게 관리되는지에 대해서 물어봤다. 대답이 많이 나오지 않았다... 나름대로 Java를 제일 잘한다고 생각했었고, 자신감도 있던 상태라 충격이 컸

devkingdom.tistory.com

 

String Constant Pool이란? | Java String Pool

Java에서 String 객체를 생성하는 방법은 2가지가 있다. 첫번째는 String literal, 즉 큰 따옴표("")를 사용하는 것이고, 두번째는 new 연산자를 사용하는 것이다. 두 방법에는 어떤 차이가 있을까? 간단한

starkying.tistory.com

'개발공부 > JAVA' 카테고리의 다른 글

Thread  (0) 2023.05.24
[JAVA] ArrayList 내부 구현  (0) 2022.09.26
[JAVA] System.out.println()을 쓰면 안 되는 이유  (1) 2022.09.26
[JAVA] String, StringBuilder, StringBuffer  (1) 2022.09.22
[JAVA] equals() 와 hashCode()  (0) 2022.09.21

댓글