【问题标题】:Stack based memory allocation基于堆栈的内存分配
【发布时间】:2011-01-06 06:33:23
【问题描述】:

参考Stack Based Memory Allocation,它被表述为“......每个线程都有一个保留的内存区域,称为它的堆栈。当一个函数执行时,它可能会将它的一些状态数据添加到堆栈顶部;当函数退出时,它负责从堆栈中删除该数据“”......堆栈上的内存会在函数退出时自动且非常有效地回收”

第一个引用的句子表示当前线程负责,第二个引用的句子表示它自动完成。

问题一:是自动完成还是由当前正在运行的线程完成?

问题 2:在 Stack 中如何释放内存?

【问题讨论】:

    标签: memory-management garbage-collection stack


    【解决方案1】:

    通过查看Call Stack 的示例(例如在许多机器上的 C 语言),您可能会了解更多。

    【讨论】:

      【解决方案2】:

      堆栈由编译器管理。

      堆由库管理。

      【讨论】:

      • 堆由库管理? (任何)编程语言的内置库?如果是,请指定您已知语言的库名称。
      【解决方案3】:

      回答问题 1:是的,它由垃圾收集器自动完成,因为它是始终与 jvm 一起运行的守护进程。它检查所有引用,如果它们没有引用(或无法访问),那么它将从堆中删除。

      对问题 2 的回答:由于局部变量和方法调用将在超出范围后立即存储在堆栈中,因此它们将从堆栈中删除。

      【讨论】:

      • 堆栈释放和分配不需要垃圾收集器。在 JVM 出现之前的几十年里,编译器一直在做这件事;)
      • 我知道堆栈释放和分配不需要垃圾收集器。
      【解决方案4】:

      问题 1:是的。

      问题2:通过减小栈指针,即分配的逆操作。

      【讨论】:

      • 显然,如果一个线程没有运行,它既不会分配也不会释放内存。
      【解决方案5】:

      问题 1自动(并且非常有效)他们的意思是仅仅通过移动内存指针(将顶部从堆栈),所有使用的内存都被回收。不需要复杂的垃圾收集。

      问题 2:堆栈只是由开始和结束指针分隔的连续内存块。指针之间的所有内容都属于堆栈,结束指针之外的所有内容都被认为是空闲内存。您通过移动结束指针(堆栈顶部)来分配和释放内存。堆上的事情要复杂得多,内存使用是碎片化的。

      【讨论】:

        猜你喜欢
        • 2018-07-24
        • 2011-05-28
        • 2014-10-26
        • 2021-04-08
        • 1970-01-01
        • 2011-10-09
        • 2019-05-17
        • 2021-11-18
        相关资源
        最近更新 更多