메모리
JVM에서 메모리는 크게 3가지 영역으로 나누어 집니다.
'아래 그림은 많이 보셨을 건데요, 자바에서 지역변수와 참조변수를 사용하게 되면 각각의 메모리 영역 어느 부분에
할당이 되는지, 어떻게 사용이 되는지에 대해 지금부터 살펴보도록 하겠습니다.
메모리 영역에 대해 살펴보기 이전에, 변수에 대해 먼저 보도록 하겠습니다.
자바의 변수는 크게 클래스 변수, 인스턴스 변수, 지역변수, 매게변수로 나뉩니다.
클래스 변수 - 클래스 영역에서 타입 앞에 static이 붙은 변수를 뜻합니다. 하나의 클래스를 통해 많은 객체가 생성 될 수 있는데, 해당 객체 모두가 공유하는 변수입니다.
인스턴스 변수 - 클래스 영역에서 static이 붙어 있지 않은 변수입니다. 객체마다 개별적인 값을 지닐 수 있습니다.
지역 변수 - 메서드 내에서 선언되고, 수행이 끝나면 소멸되는 변수입니다.
매게 변수 - 메서드 호출 시 전달하는 값을 가지고 있는 인수를 뜻합니다.
아래는 코드 상에서 예시입니다.
public class Memory {
public static int a = 5; // 클래스 변수
public int b = 4; // 인스턴스 변수
public void methodA(int input) { // 매개변수
int c = 3; // 지역 변수
}
}
메모리에서의 변수
각각의 변수들은 서로 다른 메모리 영역에 위치하게 됩니다.
지역변수와 매게변수는 Stack 영역에, 인스턴스 변수는 Heap 영역에, 클래스 변수는 static(method)영역에 저장되게 되죠.
각각의 영역에 대해 자세히 살펴보도록 하겠습니다.
Static(Method) 영역
다음 그림과 같은 코드가 있을 때 클래스 변수와 메소드, 그리고 생성자는 Static 영역에 적재됩니다.
Stack 영역
메소드 내에서 정의하는 지역변수의 데이터 값이 저장되는 공간입니다. 메소드가 호출 될 때는 스택 영역에 스택 프레임이
생기게 됩니다.
자바에서 Primitive 타입의 데이터에 해당하는 (int, double, byte, long, boolean) 등의 지역변수와 매게변수가 해당 공간에
저장됩니다. 메소드 호출이 종료되면, 메모리에서 사라지는 특징 또한 가지고 있습니다.
스택은 기본적으로 후입선출 (먼저 들어온 데이터가 먼저 나가는 구조)의 특성을 지닙니다.
위 그림과 같이 main 메서드가 실행이 되면 Stack 영역에는 main 스택 프레임이 생성됩니다.
그리고 해당 스택 프레임에 main 메서드 내에서 사용되는 지역변수인 year = 2023을 담아줍니다.
Heap 영역
JVM이 관리하는 프로그램 상에 데이터를 저장하기 위해 런타임 시에 동적으로 할당하여 사용되는 영역입니다.
객체와 배열등이 저장 되곤 합니다.
여기서 중요한 개념이, 해당 객체르 가리키는 참조변수는 Heap 영역이 아닌 Stack 영역에 적재됩니다.
Heap 영역의 특징은 Stack 영역과 다르게, 메모리 호출이 끝나더라도 삭제되지 않고 유지됩니다.
하지만 Heap 영역 안에 있는 객체를 아무도 참조하고 있지 않으면 Gc(가비지 컬렉터)에 의해 메모리에서 없어지게
됩니다.
또한 Stack 영역은 쓰레드 갯수마다 각각 생성되지만, heap은 쓰레드에 상관없이 단 하나의 heap 영역만
존재합니다.
다음과 같이 Toy 클래스의 객체를 생성할 경우 Heap 영역에 해당 객체가 생성되고, 해당 객체를 가르키는 참조 변수는
스택영역에 객체의 주소값과 함께 저장이 됩니다.
toy.move()를 호출하게 되면 해당 메서드 이름을 지닌 스택 프레임이 생성되고 함수를 호출하게 됩니다.
메서드 수행이 끝나면 해당 스택 프레임은 사라지게 됩니다.
마지막으로 main메서드가 닫는 괄호를 만나게되면, 스택 프레임에 있는 main 스택 프레임도 없어지게 됩니다.
Heap 영역에 있는 Toy 객체는 참조 변수가 없으므로 Gc(가비지 컬렉션)의 대상이 되어 정리되고
모든 코드 실행이 끝났으므로 static 영역도 지워지게 됩니다.
정리하자면, 객체를 생성하게 되면 해당 객체는 힙 영역에 저장되지만,
해당 객체를 참조하고 있는 참조 변수는 스택 영역에 저장되게 됩니다.
모든 메서드 호출이 끝나도 Heap 영역의 데이터는 살아있지만, Stack 영역은 없어지므로, 객체를 참조하고 있던 참조 변수
도 사라지게 됩니다. 참조하고 있는 변수가 없으므로 GC의 대상이 되어 힙 영역에 있는 모든 객체들은 정리가 되고
코드 실행이 끝나면 Static 영역에 있는 데이터들도 정리됩니다.
이상으로 자바의 변수를 메모리 관점에서 살펴보았습니다.
글 읽어주셔서 감사합니다.
참고 자료
☕ 그림으로 보는 자바 코드의 메모리 영역(스택 & 힙)
자바의 메모리 영역 이번 포스팅에선 자바(JAVA)를 사용하는 입장에서 알아야 할 메모리 구조 및 특징에 대해서 알아보려고 한다. 자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모
inpa.tistory.com
'Java' 카테고리의 다른 글
제너릭이란? (1) | 2023.04.12 |
---|---|
추상클래스와 인터페이스 (2) | 2023.04.09 |
가비지 컬렉션에 대해 (0) | 2023.03.21 |
객체지향 프로그래밍이란? (0) | 2023.03.13 |
Java - ArrayList와 LinkedList (0) | 2022.01.18 |