Java - 메모리 구조(Method, Stack, Heap)

Kwon Yongho·2023년 12월 12일
1

Java

목록 보기
2/6
post-thumbnail

메모리 구조(Method, Stack, Heap)

  • 자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라서 여러 영역으로 나누어 관리를 한다.
  • JVM의 메모리 공간(Runtime Data Area)은 크게 Method(Static)영역, Stack영역, Heap영역으로 구분되고 데이터 타입(자료형)에 따라 각 영역에 나눠서 할당 되게 된다.

1. 변수의 종류

Ex

public class Variable {

    public static int age = 20; // 클래스 변수(전역 변수)

    int height = 60; // 인스턴스 변수(전역 변수)

    public static void main(String[] args) { // 매개변수(파라미터)
        int size = 50; // 지역변수

    }
}

생성시기

  • 클래스변수: 클래스가 메모리에 올라갈 때
  • 인스턴스변수: 인스턴스가 생성되었을 때
  • 지역변수 / 매개변수: 위치하고 있는 메서드가 수행되었을 때

2. Method(Static) 영역

  • JVM이 동작해서 클래스가 로딩될 때 생성
  • JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 상수(final), 생성자(constructor)와 메소드(method) 등을 저장하는 공간
  • Method(Static) 영역에 있는 것은 어느곳에서나 접근 가능
  • Method(Static) 영역의 데이터는 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있다. 그래서 static 메모리에 있는 데이터들은 프로그램이 종료될 때까지 어디서든 사용이 가능하다.

3. Stack 영역

  • 기본 자료형(원시 자료형, Primitive type), 지역변수, 매개변수가 저장되는 메모리.(int, double, boolean, byte)
  • 메서드 내부의 기본자료형에 해당하는 변수 적재.
  • Heap 영역에 생성된 데이터의 참조값이 할당됨
  • 메소드가 호출될 때 메모리에 할당, 메서드 종료시 메모리에서 삭제됨.
  • 자료구조 Stack의 구조이다, LIFO(Last In First Out)
  • 각 Thread 마다 자신만의 Stack 을 가진다. (1:1) - (Thread : Stack)
  • Thread는 내부적으로 Static, Heap, Stack 영역을 가진다.
  • Thread는 다른 Thread에 접근 할 수 없지만, static, Heap 영역을 공유하여 사용 가능.


매개변수 args와 지역변수 number, age가 Stack 영역에 담아진다.

4. Heap 영역

  • JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역 참조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장 되는 공간
  • 단, Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수는 stack에 적재
  • Heap 영역은 Stack 영역과 다르게 보관되는 메모리가 호출이 끝나더라도 삭제되지 않고 유지된다.그러다 어떤 참조 변수도 Heap 영역에 있는 인스턴스를 참조하지 않게 된다면, GC(가비지 컬렉터)에 의해 메모리에서 청소된다.
  • stack은 스레드 갯수마다 각각 생성되지만, heap은 몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재
  1. 생성자 new Account() 를 호출 시

생성자를 호출하면 heap 영역에 Account 클래스 인스턴스 변수들이 저장되게 되고, stack 영역의 지역변수 account에 주소값으로 연결되게 된다.

  1. 마지막 코드가 실행되면 main 스택 프레임은 스택 영역에서 제거된다.

스택 영역은 메서드의 끝을 알리는 닫는 중괄호 }를 만나면 자동으로 메모리에서 제거된다.
그러나 힙 영역에는 여전히 객체 데이터가 메모리에 상주되게 된다.

  1. 가비지 컬렉터(GC)가 힙 영역을 청소한다.
  • 가비지 컬렉터는 힙 영역에 참조되지 않고 남아버린 고아 객체들을 식별해 힙 영역을 청소 해주는 역할을 한다.
  • 추가로 코드 실행이 모두 끝나면 Method(Static) 영역도 비워지게 된다.
  • 힙 메모리는 애플리케이션의 모든 부분에서 사용되며, 반면에 스택 메모리는 하나의 스레드가 실행될 때 사용.그래서 힙 과 메서드 공간에 저장된 객체는 어디서든지 접근이 가능하지만, 스택 메모리는 다른 스레드가 접근할 수 없다.
  • 언제든지 객체가 생성되면 항상 힙 공간에 저장되며, 스택 메모리는 힙 공간에 있는 객체를 참조만 한다.즉, 스택 메모리는 primitive 타입의 지역변수와 힙 공간에 있는 객체 참조 변수만 갖고 있다.
  • 스택메모리의 생명주기는 매우 짧으며, 힙 메모리는 애플리케이션의 시작부터 끝까지 살아남는다.

참고

0개의 댓글