Language agnostic 垃圾收集

Language agnostic 垃圾收集,language-agnostic,garbage-collection,computer-science,Language Agnostic,Garbage Collection,Computer Science,关于垃圾收集,我不太懂 首先,数据是如何分配空间的?i、 e.在堆栈或堆上(据我所知,所有静态或全局变量都在堆栈上分配了空间,局部变量在堆上分配了空间) 第二,GC在堆栈或堆上的数据上运行?i、 e像Mark/Sweep这样的GC算法会将堆栈上的数据称为根集,对吗?然后通过检查堆上哪些变量引用根集,映射堆上所有可访问的变量 如果程序没有全局变量怎么办?那么算法是如何工作的呢 问候,, darkie这可能有助于澄清您所询问的GC平台是什么——JVM、CLR、Lisp等等。它说: 首先要退一步,的某

关于垃圾收集,我不太懂

首先,数据是如何分配空间的?i、 e.在堆栈或堆上(据我所知,所有静态或全局变量都在堆栈上分配了空间,局部变量在堆上分配了空间)

第二,GC在堆栈或堆上的数据上运行?i、 e像Mark/Sweep这样的GC算法会将堆栈上的数据称为根集,对吗?然后通过检查堆上哪些变量引用根集,映射堆上所有可访问的变量

如果程序没有全局变量怎么办?那么算法是如何工作的呢

问候,,
darkie

这可能有助于澄清您所询问的GC平台是什么——JVM、CLR、Lisp等等。它说:

首先要退一步,的某些局部变量通常在堆栈上分配。然而,具体情况可能因语言而异。以C#为例,堆栈上只存储局部和方法参数。因此,在C#中,
foo
将在堆栈上分配:

public function bar() { 
    int foo = 2;
    ...
}
或者,动态分配的变量使用堆中的内存。这在直觉上是有意义的,否则每次调用
new
时堆栈都必须动态增长。此外,这意味着这些变量只能作为分配它们的局部函数中的局部变量使用,这当然不是真的,因为我们可以有(例如)类成员变量。因此,以C#为例,在以下情况下,
result
被分配到堆上:

public class MyInt
{         
    public int MyValue;
}

...
MyInt result = new MyInt();
result.MyValue = foo + 40;
...
现在考虑到这个背景,堆上的内存被垃圾收集。堆栈上的内存不需要GC,因为当前函数返回时将回收内存。在高层,GC算法通过跟踪堆上动态分配的所有对象来工作。通过
new
分配后,GC将跟踪对象,并在对象不再在范围内且不再有引用时收集对象。

查看本书

首先,数据是如何分配空间的? i、 e.堆叠或堆上(根据我的 所有静态或全局知识 在堆栈上为变量分配空间 局部变量被分配到空间 在堆上)

不,堆栈变量是方法调用和局部变量。调用方法时会创建堆栈帧,返回时会弹出堆栈帧

Java和C#中的内存通过调用“new”在堆上分配

第二,GC运行在堆栈或 堆?i、 e一个GC算法,如 标记/扫描将参考 堆栈为根集,对吗?然后是地图 堆上的所有可访问变量 检查堆上的哪些变量引用 到根集合

在堆上使用GC

标记和扫描不会被认为是最先进的GC算法。Java和.NETGC现在都使用分代模型

如果一个程序没有 全局变量?这部电影怎么样 算法行吗

在Java和C这样的语言中,“全局变量”是什么意思?所有的东西都属于一个类

对象图的根是任意的。我承认我不知道它是怎么选的。这是对单处理器垃圾收集技术的一次很好的调查。它将使您对GC有基本的理解和术语。然后,继续阅读Jones和Lins的书“垃圾收集:自动动态内存管理算法”。与我上面提到的调查文章相反,这本书不能在网上免费获得;你必须买它;但是它是值得的。

在Windows内存模型上有一个非常好的展示,包括.NET模型和GC,在它们的.NET应用程序中!档案:


您可能会发现这篇文章的简短摘要很有用

最终,垃圾收集必须从处理器的寄存器开始,因为处理器无法访问的任何对象都可以回收。根据语言和运行时系统的不同,可以静态地假设线程的堆栈和寄存器以及“全局变量”也是可访问的


堆栈可能会得到局部变量。因此,在简单的GCs中,首先扫描线程上下文、它们的堆栈和全局变量。但并非所有情况下都是如此。有些语言不使用堆栈或具有全局变量。更重要的是,地面军事系统可以使用a,这样他们就不必每次都查看每个堆栈或全局。一些特殊的硬件,如符号在寄存器上有障碍

您是否询问特定的平台/垃圾收集器?请编辑您的标签和/或问题,使其更具体。这通常是。。。参考维基百科链接:非常感谢。。这对我解释了很多。非常感谢。这使得事情更容易理解“要采用C#,只有值类型存储在堆栈上。”-这不是严格正确的。引用“C”深入,第52页:“…变量的值存在于声明的位置-因此,如果您有一个带有int类型实例变量的类,任何给定对象的该变量的值将始终存在于对象的其余数据所在位置-堆上…只有局部变量和方法参数存在于堆栈上…”对,我的意思是只有值类型的局部变量才会存储在堆栈上。贾斯汀:当你说:“这在直觉上是有意义的,否则每次调用一个新的堆栈时,堆栈都必须动态增长。而且,这意味着这些变量只能在分配它们的局部函数中使用,这当然不是真的”。。。你是说这只对C#来说?下面是一段用Java编写的代码:public类StringCheck{public static void main(String[]args){callingOne();callingTwo();}public static void callingOne(){Integer temp=new Integer(“1”);}public static void callin