자바의 스택 메모리 및 힙 공간

1. 소개

최적의 방식으로 애플리케이션을 실행하기 위해 JVM은 메모리를 스택 및 힙 메모리로 나눕니다. 새로운 변수와 객체를 선언 하거나 , 새로운 메소드를 호출 하거나 , String을 선언 하거나, 유사한 작업을 수행 할 때마다 JVM은 Stack Memory 또는 Heap Space에서 이러한 작업에 메모리를 지정합니다.

이 자습서에서는 이러한 메모리 모델에 대해 설명합니다. 우리는 그들 사이의 몇 가지 주요 차이점, RAM에 저장되는 방법, 제공하는 기능 및 사용 위치를 나열합니다.

2. 자바의 스택 메모리

Java의 스택 메모리는 정적 메모리 할당 및 스레드 실행에 사용됩니다. 여기에는 메서드에 고유 한 기본 값과 메서드에서 참조되는 힙에있는 개체에 대한 참조가 포함됩니다.

이 메모리에 대한 액세스는 LIFO (Last-In-First-Out) 순서입니다. 새 메서드가 호출 될 때마다 스택 상단에 기본 변수 및 객체에 대한 참조와 같은 해당 메서드에 특정한 값을 포함하는 새 블록이 생성됩니다.

메서드가 실행을 마치면 해당 스택 프레임이 플러시되고 흐름이 호출 메서드로 돌아가고 다음 메서드에 공간을 사용할 수있게됩니다.

2.1. 스택 메모리의 주요 기능

지금까지 논의한 내용 외에 다음은 스택 메모리의 다른 기능입니다.

  • 새로운 메서드가 각각 호출되고 반환됨에 따라 확장 및 축소됩니다.
  • 스택 내부의 변수는 변수를 생성 한 메서드가 실행되는 동안 만 존재합니다.
  • 메서드 실행이 완료되면 자동으로 할당되고 할당 해제됩니다.
  • 이 메모리가 가득 차면 Java는 java.lang.StackOverFlowError를 발생시킵니다.
  • 이 메모리에 대한 액세스는 힙 메모리에 비해 빠릅니다.
  • 이 메모리는 각 스레드가 자체 스택에서 작동하므로 스레드로부터 안전합니다.

3. 자바의 힙 공간

Java의 힙 공간은 런타임시 Java 객체 및 JRE 클래스에 대한 동적 메모리 할당에 사용됩니다 . 새 개체는 항상 힙 공간에 생성되고이 개체에 대한 참조는 스택 메모리에 저장됩니다.

이러한 개체는 전역 액세스 권한이 있으며 응용 프로그램의 어느 곳에서나 액세스 할 수 있습니다.

이 메모리 모델은 세대라고하는 더 작은 부분으로 나뉩니다.

  1. Young Generation – 모든 새로운 개체가 할당되고 노화되는 곳입니다. 이것이 가득 차면 사소한 가비지 콜렉션이 발생합니다.
  2. Old or Tenured Generation – 오래 살아남은 객체가 저장되는 곳입니다. 사물이 Young Generation에 저장되면 사물의 연령에 대한 임계 값이 설정되고 해당 임계 값에 도달하면 사물이 구세대로 이동합니다.
  3. 영구 생성 – 런타임 클래스 및 애플리케이션 메서드에 대한 JVM 메타 데이터로 구성됩니다.

이 문서에서는 JVM, JRE 및 JDK의 차이점에 대해서도 설명합니다.

요구 사항에 따라 힙 메모리의 크기를 항상 조작 할 수 있습니다. 자세한 내용은 링크 된 Baeldung 기사를 참조하십시오.

3.1. Java 힙 메모리의 주요 기능

지금까지 논의한 내용 외에 힙 공간의 다른 기능은 다음과 같습니다.

  • Young Generation, Old 또는 Tenured Generation, Permanent Generation을 포함한 복잡한 메모리 관리 기술을 통해 액세스합니다.
  • 힙 공간이 가득 차면 Java에서 java.lang.OutOfMemoryError가 발생합니다.
  • 이 메모리에 대한 액세스는 스택 메모리보다 상대적으로 느립니다.
  • 스택과 달리이 메모리는 자동으로 할당 해제되지 않습니다. 메모리 사용의 효율성을 유지하기 위해 사용하지 않는 개체를 확보하려면 가비지 수집기가 필요합니다.
  • 스택과 달리 힙은 스레드로부터 안전하지 않으며 코드를 적절하게 동기화하여 보호해야합니다.

4. 예

지금까지 배운 내용을 바탕으로 간단한 Java 코드를 분석하고 여기에서 메모리가 관리되는 방식을 평가 해 보겠습니다.

class Person { int id; String name; public Person(int id, String name) { this.id = id; this.name = name; } } public class PersonBuilder { private static Person buildPerson(int id, String name) { return new Person(id, name); } public static void main(String[] args) { int id = 23; String name = "John"; Person person = null; person = buildPerson(id, name); } }

이 단계별 분석 :

  1. main () 메소드 에 들어가면 스택 메모리에이 메소드의 프리미티브와 참조를 저장하기위한 공간이 생성됩니다.
    • 정수 ID 의 원시 값은 스택 메모리에 직접 저장됩니다.
    • Person 유형 의 참조 변수 person 도 힙의 실제 객체를 가리키는 스택 메모리에 생성됩니다.
  2. main () 에서 매개 변수화 된 생성자 Person (int, String)에 대한 호출 은 이전 스택 위에 추가 메모리를 할당합니다. 다음을 저장합니다.
    • 스택 메모리에서 호출 객체 의 this 객체 참조
    • 스택 메모리 의 기본 값 ID
    • 힙 메모리의 문자열 풀에서 실제 문자열을 가리키는 문자열 인수 이름 의 참조 변수
  3. 주요 방법은 상기 호출 buildPerson () 상기 할당 이전의 상부에 스택 메모리 열린다 정적 방법. 이것은 위에서 설명한 방식으로 변수를 다시 저장합니다.
  4. 그러나, 새로 생성 된 개체에 대한 사람 유형의 사람 , 모든 인스턴스 변수는 힙 메모리에 저장됩니다.

이 할당은이 다이어그램에 설명되어 있습니다.

5. 요약

이 기사를 마치기 전에 스택 메모리와 힙 공간의 차이점을 간단히 요약 해 보겠습니다.

매개 변수 스택 메모리 힙 공간
신청 Stack is used in parts, one at a time during execution of a thread The entire application uses Heap space during runtime
Size Stack has size limits depending upon OS and is usually smaller then Heap There is no size limit on Heap
Storage Stores only primitive variables and references to objects that are created in Heap Space All the newly created objects are stored here
Order It is accessed using Last-in First-out (LIFO) memory allocation system This memory is accessed via complex memory management techniques that include Young Generation, Old or Tenured Generation, and Permanent Generation.
Life Stack memory only exists as long as the current method is running Heap space exists as long as the application runs
Efficiency Comparatively much faster to allocate when compared to heap Slower to allocate when compared to stack
Allocation/Deallocation 이 메모리는 메서드가 각각 호출되고 반환 될 때 자동으로 할당되고 할당 해제됩니다. 새 개체가 생성되고 더 이상 참조되지 않을 때 Gargabe Collector에서 할당을 취소 할 때 힙 공간이 할당됩니다.

6. 결론

스택과 힙은 Java가 메모리를 할당하는 두 가지 방법입니다. 이 기사에서는 더 나은 Java 프로그램을 개발하기 위해 작동 방식과 사용시기를 이해했습니다.

Java의 메모리 관리에 대해 자세히 알아 보려면 여기에서이 기사를 참조하십시오. 또한이 기사에서 간략하게 설명하는 JVM 가비지 콜렉터에 대해서도 설명했습니다.