최근에 자바를 공부하고 있지만 메모리 영역에 대해 자세히 알지 않아서 이번 기회에 정리를 하게 되었다.
먼저 자바의 메모리영역을 알기 전에 JVM부터 알아보겠다.
자바 가상 머신
자바 프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받고 그 메모리를 용도에 따라서 여러 영역으로 나누어 관리한다.
Java의 바이트 코드를 해석하고 실행하는 역할을 한다.
OS에 상관없이 실행할 수 있다.
JVM의 메모리 공간(Runtime Data Area)은 크게 Method(Static)영역, Stack 영역, Heap 영역으로 구분되고 데이터 타입(자료형)에 따라 각 영역에 나눠서 할당되게 된다.

변수는 크게 네 종류로 변수의 선언된 위치에 따라서 클래스변수, 인스턴스변수, 지역변수, 매개변수로 나뉜다.
public class Variable {
public static int age = 20; // 클래스 변수(전역 변수)
int height = 60; // 인스턴스 변수(전역 변수)
public static void main(String[] args) { // 매개변수(파라미터)
int size = 50; // 지역변수
}
}
| 변수 종류 | 선언 위치 | 설명 | 생성 시기 | 소멸 시기 | 저장 메모리 |
|
클래스 변수 (Static variable) |
클래스 영역 | static 키워드가 붙고 여러 객체에서 공통으로 사용할 때 사용 | 클래스가 메모리에 올라갈 때 | 프로그램 종료 시 | Static |
|
인스턴스 변수 (Instance variable) |
클래스 영역 | 클래스 영역에서 static이 아닌 변수 | 인스턴스가 생성될 때 | 인스턴스 소멸시 | Heap |
|
지역 변수 (Local variable) |
메서드 영역 |
메서드 내부에서 선언된다. 초기 값을 지정해야 사용 가능. |
블록 내에서 변수의 선언문이 실행 될 때 | 블록을 벗어날 때 | Stack |
JVM이 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static) 변수, 상수(final), 생성자(constructor)와 메소드(method)등을 저장하는 공간.
JVM이 동작해서 클래스가 로딩될 때 생성.
Static 영역에 있는 것은 어디서든 접근 가능하다.
JVM이 종료 시(프로그램이 종료 시) 메모리에서 해제 된다.
JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역
참조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장되는 공간
단, Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수는 stack에 적재한다.
Heap 영역은 Stack 영역과 다르게 보관되는 메모리가 호출이 끝나더라도 삭제되지 않고 유지된다.
Stack은 스레드 갯수마다 각각 생성되지만, Heap은 몇 개의 스레드가 존재하든 상관없이 단 하나의 Heap 영역만 존재한다.
기본 자료형의 데이터(int, double, byte, long, ...등), 지역 변수, 매개변수가 저장되는 공간
메소드가 호출될 때 스택 영역에 스택 프레임이 생기고 그 안에 메소드를 호출한다.
메소드가 호출 될 때 메모리에 할당되고 종료되면 메모리에서 사라진다.
LIFO(Last-In-First-Out)

관련글
https://github.com/jbn750/JavaLang/blob/master/src/ch10_Memory/Ch10_Memory.md
참조
https://lucas-owner.tistory.com/38
https://blog.naver.com/chlwlstjd10/222239136195
https://inpa.tistory.com/entry/JAVA-☕-그림으로-보는-자바-코드의-메모리-영역스택-힙#힙_과_스택_메모리의_차이점