垃圾收集是用于回收堆对象还是堆和栈中的对象?
Is garbage collection used for reclaiming just heap objects or objects in both heap and stack?
我正在阅读 Scott 的 Programming Language Pragmatics,并想知道以下问题:
垃圾收集(例如通过引用计数)是仅用于回收堆对象还是堆和栈中的对象?
例如,在Python、Java和C#中,使用垃圾收集,
一旦堆栈对象超出范围,是否会在不进行垃圾回收的情况下自动释放堆栈对象?
在Java中,对象只驻留在堆中。如果对你有帮助的话。
堆栈中根本没有任何"deallocation"。所以,是的,垃圾收集器不参与这个过程。一旦不需要,您放入堆栈的所有内容都会被程序遗忘。应用程序通常只是简单地从堆栈指针中减去对象的大小(以字节为单位),这相当于清除上次放置的所有内容。
Is garbage collection (e.g. by reference count) used for reclaiming just heap objects or objects in both heap and stack?
它仅用于堆对象。 Stack 完全用于保证短生命周期的对象(即它们不会超过创建它们的函数)。对于那些对象,垃圾收集是不必要的。
尽管弄清楚哪些对象是 "heap objects" 可能并不简单。例如,JVM 使用逃逸分析来检测可以在堆栈而不是堆上分配的对象。另一个例子是 C#,其中 async
方法中的值类型局部变量通常将分配在堆上。
java 中的垃圾收集器只是声明堆中的对象,但它会跟踪堆栈内存以查看是否有任何堆对象在被声明之前仍在被引用 claimed.Stack 内存一旦方法调用结束。
我正在阅读 Scott 的 Programming Language Pragmatics,并想知道以下问题:
垃圾收集(例如通过引用计数)是仅用于回收堆对象还是堆和栈中的对象?
例如,在Python、Java和C#中,使用垃圾收集, 一旦堆栈对象超出范围,是否会在不进行垃圾回收的情况下自动释放堆栈对象?
在Java中,对象只驻留在堆中。如果对你有帮助的话。
堆栈中根本没有任何"deallocation"。所以,是的,垃圾收集器不参与这个过程。一旦不需要,您放入堆栈的所有内容都会被程序遗忘。应用程序通常只是简单地从堆栈指针中减去对象的大小(以字节为单位),这相当于清除上次放置的所有内容。
Is garbage collection (e.g. by reference count) used for reclaiming just heap objects or objects in both heap and stack?
它仅用于堆对象。 Stack 完全用于保证短生命周期的对象(即它们不会超过创建它们的函数)。对于那些对象,垃圾收集是不必要的。
尽管弄清楚哪些对象是 "heap objects" 可能并不简单。例如,JVM 使用逃逸分析来检测可以在堆栈而不是堆上分配的对象。另一个例子是 C#,其中 async
方法中的值类型局部变量通常将分配在堆上。
java 中的垃圾收集器只是声明堆中的对象,但它会跟踪堆栈内存以查看是否有任何堆对象在被声明之前仍在被引用 claimed.Stack 内存一旦方法调用结束。