>  기사  >  Java  >  힙 대 스택: Java가 기억하거나 잊어버릴 항목을 관리하는 방법

힙 대 스택: Java가 기억하거나 잊어버릴 항목을 관리하는 방법

PHPz
PHPz원래의
2024-09-08 16:32:02315검색

프로그램을 실행할 때 운영 체제는 이 애플리케이션이 필요한 기간 동안 데이터를 저장하고 검색할 수 있도록 메모리를 할당합니다. 프로그래머가 자유롭게 메모리를 할당하고 포인터를 "손으로" 관리할 수 있는 C 또는 C++와 달리 Java에서는 JVM(Java Virtual Machine)이 휘발성 저장소를 관리하여 이러한 복잡성을 힙과 힙이라는 두 가지 할당 시스템으로 추상화합니다. 스택.

두 가지의 차이점은 저장 목적과 해당 데이터를 여러 프로세스와 공유해야 하는지 여부에 있습니다.

JVM은 단기 데이터용 스택을 사용하며 LIFO(Last In First Out) 구조를 따릅니다. 스택은 메소드 실행을 관리하고, 로컬 변수 및 메소드 호출을 프레임에 체계적으로 저장하는 데 사용되는 메모리 영역입니다. JVM의 각 스레드에는 자체 스택이 있습니다.

힙은 모든 스레드 간에 공유되는 전역 메모리 영역으로, 이를 생성한 메서드의 범위를 넘어서 유용한 수명을 가져야 하는 객체와 변수가 할당됩니다.

메모리 온 더 힙(Memory on the Heap)은 참조되지 않는 객체를 제거하여 공간을 확보하는 가비지 컬렉터(Garbage Collector)에 의해 관리되며 장기 데이터에 사용됩니다.

실제적인 예를 들어보겠습니다.

메서드 범위 내에서 기본 변수가 생성되면 해당 메서드가 실행되는 동안 사용할 수 있어야 합니다. 이런 식으로 이 변수를 저장하는 사람은 스택입니다. 프로그램에서 고유하고 특정 용도로 사용되는 데이터의 수명 주기를 담당하는 스택입니다.

그러나 메소드가 인스턴스를 생성하면 이 객체는 선언된 위치뿐만 아니라 프로그램의 다른 부분에서도 사용될 수 있습니다. 이는 데이터베이스의 레코드를 나타내는 객체를 생성할 때 분명히 발생합니다. 우리 프로그램에서는 실행 전반에 걸쳐 동일한 인스턴스를 참조, 편집 및 제거할 수 있습니다. 이렇게 하면 Heap이 객체 저장을 담당하게 됩니다.

이 점을 설명하기 위해 저자 Hanumant Deshmukh가 자신의 가이드 "OCP Java SE 17/21 프로그래머 시험 기초"에서 설명하는 간단한 예를 사용하겠습니다. 그런데 이 책은 매우 복잡한 과정을 설명하는 데 매우 교훈적이기 때문에 훌륭합니다. 저처럼 Oracle Certified Professional(OCP) 자격증을 찾고 계시다면 적극 추천합니다. 저자는 교육 목적으로 String 인스턴스를 사용하지만 여기서는 저작권 위반 위험을 피하기 위해 사용자 정의 개체를 사용하겠습니다(:S)

public class Main {
    public static void main(String[] args) {
        HeapObj heapObject = newObject();
        int counter = 0;

        while (counter++ < 10){
            print(heapObject.getName());
        }
    }

    public static HeapObj newObject(){
        return new HeapObj("Happy instance");
    }

    public static void print(String text){
        System.out.println(text);
    }
}

예제에서 Main 클래스는 세 가지 메서드, 즉 기본 메서드, HeapObj 개체의 인스턴스를 생성하는 메서드, 텍스트만 인쇄하는 메서드를 호출합니다.

모든 메소드가 이미 호출된 상태에서 사진을 찍으면 스택과 힙은 다음과 같습니다.

Heap vs Stack: como o Java gerencia o que deve ser lembrado ou esquecido

즉,

1. 시작 시:

스택: 메인 프레임(args, heapObject, 카운터 포함).
힙: 비어 있습니다.

2. newObject 이후:

스택: 메인 프레임(args, heapObject 참조, 카운터 포함).
힙: "Happy 인스턴스"라는 문자열이 포함된 HeapObj 개체입니다.

3. 루프 도중:

스택: 메인 프레임(args, heapObject 참조, 카운터 포함), 쌓이거나 쌓이지 않은 여러 인쇄 프레임.
힙: 동일한 HeapObj 개체 및 "Happy 인스턴스" 문자열.

4. 루프 후:

스택: 메인 프레임(args, heapObject 참조 포함).
힙: 동일한 HeapObj 개체 및 "Happy 인스턴스" 문자열.

5. 프로그램 종료 시:

스택: 비어 있습니다.
힙: 비어 있습니다.

위 내용은 힙 대 스택: Java가 기억하거나 잊어버릴 항목을 관리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.