【问题标题】:Is garbage collection used for reclaiming just heap objects or objects in both heap and stack?垃圾收集是否仅用于回收堆对象或堆和堆栈中的对象?
【发布时间】:2023-03-17 00:19:01
【问题描述】:

我正在阅读 Scott 的 Programming Language Pragmatics,我想知道以下问题:

垃圾回收(例如通过引用计数)是否仅用于回收堆对象或堆和堆栈中的对象?

例如,在使用垃圾回收的 Python、Java 和 C# 中, 一旦超出范围,堆栈对象是否会自动释放而不进行垃圾回收?

【问题讨论】:

  • @DiskJunky 你的意思是堆栈对象的释放是由垃圾收集器控制的吗?
  • 在 C# 中,对象的管理方式比“堆栈”和“堆”要复杂得多。有不同级别的内存分配(Gen0 到 Gen2)、大对象堆等。在您的问题的上下文中,C# GC 两者兼而有之
  • 从一开始,它们就从来没有真正在堆栈上。在 C# 中如何分配和释放内存是相当复杂的。排除非托管引用后,GC 将遍历所有相关的内存部分以根据需要解除分配
  • 这个问题实在是太笼统了。你需要缩小范围。 C#、Python 和 Java 都有非常不同的垃圾收集方式。如果您想了解 Python 垃圾收集器,请仅询问 Python。 C# 和 Java 也是如此。

标签: java c# python garbage-collection programming-languages


【解决方案1】:

垃圾回收(例如通过引用计数)是否用于仅回收堆对象或堆和堆栈中的对象?

它仅用于堆对象。堆栈完全用于保证短生命周期的对象(即它们不会超过创建它们的函数)。对于那些对象,垃圾回收是不必要的。

虽然找出哪些对象是“堆对象”可能并非易事。例如,JVM 使用逃逸分析来检测可以分配在堆栈而不是堆上的对象。另一个例子是 C#,其中 async 方法中的值类型局部变量通常要在堆上分配。

【讨论】:

  • 谢谢。如果我理解你,Java既有堆对象也有堆栈对象(如你的例子),垃圾收集仅适用于堆对象而不适用于堆栈对象。 C# 也有堆栈对象吗?你能举一些例子吗? Python 是否也同时具有堆栈和堆对象? (如果实现很重要,CPython)
  • JVM 的一些实现使用垃圾收集来回收未使用的堆栈帧。如果 JVM 不使用本机堆栈,则使用堆上的帧对象列表是可行的策略。
  • @Tim 在 Java 和 C# 中,基本类型的局部变量,如 int,通常分配在堆栈上。 C# 也有自定义值类型,例如 DateTime,其行为相同。
  • @svick 的“原始类型”是指预定义类型,即类型而不是自定义类型?
【解决方案2】:

堆栈中根本没有任何“释放”。所以,是的,垃圾收集器不参与这个过程。一旦您不需要它,您放入堆栈的所有内容都会被程序忘记。应用程序通常只是简单地从堆栈的指针中减去对象的大小(以字节为单位),这相当于清理上次放置的所有内容。

【讨论】:

  • 谢谢。 Python、Java 和 C# 有堆栈对象吗?
  • 在 C# 中,值对象存储在堆栈中。如果我记得的话,Java 的工作方式类似。 Python 中的内存管理取决于它的实现。
  • @DanilEroshenko “在 C# 中,值对象存储在堆栈中。”这是一个危险的错误简化。
  • 是的,我听说过拳击。但是如果我不简化的话,那会是很多文字。问题是“是否涉及垃圾收集”,无论如何简短的回答是“否”。
  • @DanilEroshenko 这不仅仅是拳击。例如,使用class C { int i; }i 将在堆上分配(至少在当前的 CLR 实现中)。在这些情况下,GC参与
【解决方案3】:

Java 中的垃圾收集器仅声明堆中的对象,但它会跟踪堆栈内存,以查看是否仍有任何堆对象在被声明之前被引用。一旦方法调用结束,堆栈内存就会被声明。

【讨论】:

    【解决方案4】:

    在 Java 中,对象仅驻留在堆中。如果这可以帮助你。

    【讨论】:

    • 这不能回答问题。此外,JVM 有时会使用转义分析在堆栈上分配对象。
    • 带有逃逸分析的事件,对象未在 HotSpot JVM 的堆栈上分配。转义分析可以实现标量替换 - 用一堆局部变量(显然在堆栈上)替换对象。
    猜你喜欢
    • 2013-12-30
    • 2015-08-10
    • 2014-03-27
    • 2012-05-29
    • 2016-02-11
    • 1970-01-01
    • 2014-10-18
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多