我正在阅读斯科特的编程语言语用学,并对以下问题感到疑惑:
垃圾收集(例如通过引用计数)是否用于回收堆和堆栈中的堆对象或对象?
例如,在使用垃圾收集的Python,Java和C#中, 堆栈对象一旦超出范围就会自动解除分配而不进行垃圾回收吗?
答案 0 :(得分:2)
垃圾收集(例如通过引用计数)是否用于回收堆和堆栈中的堆对象或对象?
它仅用于堆对象。堆栈完全用于保证短寿命的对象(即它们不会超过创建它们的函数)。对于那些对象,垃圾收集是不必要的。
虽然找出哪些对象是"堆对象"可能不是微不足道的。例如,JVM使用转义分析来检测可以在堆栈而不是堆上分配的对象。另一个例子是C#,其中async
方法中的值类型局部变量通常将在堆上分配。
答案 1 :(得分:1)
堆栈中根本没有“解除分配”。所以,是的,垃圾收集器不参与此过程。一旦你不需要它,你放入堆栈的所有内容都会被程序忘记。应用程序通常只是从堆栈的指针中减去对象的大小(以字节为单位),这相当于清除上次放置的所有内容。
答案 2 :(得分:1)
java中的垃圾收集器只是声明堆中的对象,但它确实跟踪堆栈内存以查看是否有任何堆对象在被声明之前仍然被引用。一旦方法调用结束,就会声明堆栈内存。
答案 3 :(得分:-1)
在Java中,对象只驻留在堆中。如果这可以帮到你。