18

我正在阅读 Mozilla 的 Javascript 教程,我通过了这条信息。

高级语言嵌入了一个叫做“垃圾收集器”的软件,它的工作是跟踪内存分配和使用,以便找到何时不再需要分配的内存,在这种情况下,它会自动释放它。这个过程是一个近似值,因为知道是否需要某块内存的一般问题是无法确定的(不能通过算法解决)。

我熟悉不可判定性和垃圾收集器的概念,但我似乎无法理解为什么这是一个不可判定的问题?

4

2 回答 2

14

我熟悉的所有垃圾收集器都是通过收集不再可以访问的内存来工作的,例如指向它的所有(传递闭包)变量都​​超出了范围。但这是可以收集的一组内存空间的近似值,因为在任何时候,一个内存位置可能仍然有一个变量在范围内指向它,但它永远不会被再次访问。

找到可以收集的精确内存空间集可以简单地简化为任何未定问题 - 例如,在以下程序中找到可以在 A 点收集的内存空间集:

x = allocate()
// Point A
if (result of some known-to-be-undecidable problem is true):
  print(x)

因此,找到该集合本身是无法确定的。

于 2016-05-14T15:55:43.893 回答
10

因此,您可以修改任何程序以在堆上分配一些空间,并且仅在原始程序终止时才访问它。一个最佳的垃圾收集器只会在程序没有终止的情况下收集内存。

我们可以决定一个程序是否会终止吗?

于 2015-12-24T13:24:25.460 回答