为什么知道是否需要某些内存是不可判定的?

ral*_*aul 16 garbage-collection memory-management decidable

我正在使用Mozilla的Javascript教程,我来了解这条信息.

高级语言嵌入了一个名为"垃圾收集器"的软件,其工作是跟踪内存分配和使用,以便找到不再需要分配内存的时间,在这种情况下,它将自动释放它.该过程是近似的,因为知道是否需要某些存储器的一般问题是不可判定的(不能通过算法解决).

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

Oak*_*Oak 11

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

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

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

所以发现这个集合本身就是不可判定的.

  • @NursultanZarlyk让我们将if语句测试的问题的解决方案命名为`P`,让我们调用收集器的决定是否可以在A点收集`x`指向的内存为`C`.`P =>!C`因为否则我们的收藏家可能收集实时记忆,并且`!P => C`,因为我们的假设收集器不会过度近似.这意味着`P`的解决方案也是`C`的解决方案,因此它是减少.我在这里错过了什么? (2认同)

tra*_*m_3 8

因此,您可以修改任何程序以在堆上分配一些空间,并且只有在原始程序终止时才访问它.如果程序没有终止,那么最佳垃圾收集器将仅收集内存.

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