首页 >Java >java教程 >堆与堆栈:Java 如何管理要记住或忘记的内容

堆与堆栈:Java 如何管理要记住或忘记的内容

PHPz
PHPz原创
2024-09-08 16:32:02448浏览

当我们运行程序时,操作系统会分配内存,以便该应用程序可以根据需要存储数据并检索数据。与 C 或 C++ 中程序员可以自由地“手动”分配内存和管理指针不同,在 Java 中,JVM(Java 虚拟机)管理易失性存储,为我们在两个分配系统(堆和内存)中抽象了这种复杂性。堆栈。

它们之间的区别在于存储的目的以及是否需要与多个进程共享该数据。

JVM 使用堆栈来存储短期数据并遵循 LIFO(后进先出)结构。堆栈是一个内存区域,用于管理方法的执行,在帧中以有组织的方式存储局部变量和方法调用。 JVM 中的每个线程都有自己的堆栈。

堆是所有线程之间共享的全局内存区域,其中分配的对象和变量的使用寿命需要超出创建它们的方法的范围。

堆上的内存由垃圾收集器管理,它会删除未引用的对象以释放空间,用于长期数据。

让我们用一个实际的例子。

当在方法范围内创建原始变量时,它必须在方法执行时可供使用。这样,堆栈将存储该变量,因为它负责在程序中具有独特且特定用途的数据的生命周期。

但是,当方法创建实例时,该对象可以在程序的其他部分使用,而不仅仅是在声明它的地方。当我们创建一个代表数据库中记录的对象时,这显然会发生。在我们的程序中,可以在整个执行过程中查阅、编辑和删除同一实例。这样,堆将负责存储对象。

为了说明这一点,我将使用作者 Hanumant Deshmukh 在他的指南“OCP Java SE 17/21 程序员考试基础知识”中描述的一个简单示例。顺便说一句,这本书很棒,因为它在解释相当复杂的过程方面非常具有说教性。如果您像我一样正在寻找 Oracle 认证专家 (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 类调用三个方法:主方法 (main)、创建 HeapObj 对象实例的方法和仅打印文本的方法。

如果我们在所有方法都被调用后拍照,堆栈和堆将如下所示:

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

换句话说:

1. 启动时:

Stack:主框架(包含args、heapObject、计数器)。
堆:空。

2.newObject之后:

堆栈:主框架(包含参数、heapObject 引用、计数器)。
Heap:带有字符串“Happy instance”的 HeapObj 对象。

3. 循环期间:

Stack:主框架(包含args、heapObject引用、计数器),堆叠和未堆叠的多个打印帧。
堆:相同的 HeapObj 对象和字符串“Happy instance”。

4.循环后:

Stack:主框架(包含args、heapObject引用)。
堆:相同的 HeapObj 对象和字符串“Happy instance”。

5. 程序结束时:

堆栈:空。
堆:空。

以上是堆与堆栈:Java 如何管理要记住或忘记的内容的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn