JAVA의 메모리 영역(Method, Stack, Heap)

임정빈·2024년 2월 23일

최근에 자바를 공부하고 있지만 메모리 영역에 대해 자세히 알지 않아서 이번 기회에 정리를 하게 되었다.

먼저 자바의 메모리영역을 알기 전에 JVM부터 알아보겠다.


1. JVM(Java Vertual Machine)

자바 가상 머신

  • 자바 프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받고 그 메모리를 용도에 따라서 여러 영역으로 나누어 관리한다.

  • Java의 바이트 코드를 해석하고 실행하는 역할을 한다.

  • OS에 상관없이 실행할 수 있다.

    • JVM 설치만 하면 어떤 운영체제에서든 java 파일을 실행할 수 있다.

1.1 JVM 실행 순서

  1. java 파일을 컴파일러(Compiler)를 통해 .class 파일로 변환한다.
  2. .class 파일을 JVM의 클래스로더(ClassLoader: 런타임에 클래스를 동적으로 JVM에 로드 하는 역할을 수행하는 모듈)에게 보낸다.
  3. 클래스로더에서 JVM 런타임 영역으로 로딩(할당)하여 메모리에 올린다.


2. 자바의 메모리 영역

JVM의 메모리 공간(Runtime Data Area)은 크게 Method(Static)영역, Stack 영역, Heap 영역으로 구분되고 데이터 타입(자료형)에 따라 각 영역에 나눠서 할당되게 된다.

  • 각 영역은 목적에 맞게 사용되고, 어플리케이션의 성능에 영향을 미친다.
    • 같은 기능을 하는 어플리케이션이라도, 메모리 관리에 따라 성능에 차이가 생긴다.
    • 메모리를 관리하지 않고 구성하게 된다면 StackOverFlow가 발생하여 어플리케이션이 종료될 수도 있다.


2.1 자바 변수의 종류

변수는 크게 네 종류로 변수의 선언된 위치에 따라서 클래스변수, 인스턴스변수, 지역변수, 매개변수로 나뉜다.

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

2.2 Method(Static) 영역

JVM이 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static) 변수, 상수(final), 생성자(constructor)와 메소드(method)등을 저장하는 공간.

  • JVM이 동작해서 클래스가 로딩될 때 생성.

  • Static 영역에 있는 것은 어디서든 접근 가능하다.

  • JVM이 종료 시(프로그램이 종료 시) 메모리에서 해제 된다.


2.3 Heap 영역

JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역

  • 참조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장되는 공간

  • 단, Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수는 stack에 적재한다.

  • Heap 영역은 Stack 영역과 다르게 보관되는 메모리가 호출이 끝나더라도 삭제되지 않고 유지된다.

    • 그러다 어떤 참조 변수도 Heap 영역에 있는 인스턴스를 참조하지 않게 된다면, 가비지 컬렉터에 의해 메모리에 청소된다.
  • Stack은 스레드 갯수마다 각각 생성되지만, Heap은 몇 개의 스레드가 존재하든 상관없이 단 하나의 Heap 영역만 존재한다.


2.4 Stack 영역

기본 자료형의 데이터(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-☕-그림으로-보는-자바-코드의-메모리-영역스택-힙#힙_과_스택_메모리의_차이점

profile
신입개발자

0개의 댓글