Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存在循环引用时有关.NET垃圾收集器的问题_.net - Fatal编程技术网

存在循环引用时有关.NET垃圾收集器的问题

存在循环引用时有关.NET垃圾收集器的问题,.net,.net,我知道.net垃圾收集器检测循环引用,但我想知道循环引用是否会导致对象停留的时间超过必要的时间 我在我的ASP.NET应用程序中有一个循环引用(出于性能相关的原因,我打算使用循环引用),我能逃脱吗 关于Java GC可以检测周期并处理它们。我敢打赌C#GC也可以 与非循环引用相比,CLR删除循环引用所用的时间不会更长。CLR使用多种技术组合进行垃圾收集。不过,最快的版本是它从所有根对象(堆栈上的对象,或使用强GC句柄保存的对象)开始。从这些对象可以访问的任何对象都是活动的。其他任何东西都将被收集

我知道.net垃圾收集器检测循环引用,但我想知道循环引用是否会导致对象停留的时间超过必要的时间

我在我的ASP.NET应用程序中有一个循环引用(出于性能相关的原因,我打算使用循环引用),我能逃脱吗


关于

Java GC可以检测周期并处理它们。我敢打赌C#GC也可以

与非循环引用相比,CLR删除循环引用所用的时间不会更长。CLR使用多种技术组合进行垃圾收集。不过,最快的版本是它从所有根对象(堆栈上的对象,或使用强GC句柄保存的对象)开始。从这些对象可以访问的任何对象都是活动的。其他任何东西都将被收集。循环引用不会影响此算法的结果,除非CLR必须确保检查它们,而不是在循环中行走,它不需要检测循环,因为在它使用的算法中,循环根本不是问题

如果有一条从根(堆栈上的变量或静态变量,基本上,因为这些变量是活动的,不能被GC’ed)到对象的路径,那么该对象也必须是活动的,并且不会被GC’ed


如果没有路径,那么对象是死的,可以安全地进行GC'ed。周期根本不重要。因此,循环不会对对象的生存期产生影响。

基本上,如果任何静态、局部变量、参数或成员变量引用了一个对象,则该对象不可用于垃圾收集。循环引用是否存在并不重要。要么引用循环,在这种情况下不收集循环,要么不引用循环,在这种情况下可以收集整个循环


如果一个类型实现了终结器,它将继续运行集合,直到它的终结器运行为止

GC将收集根对象未引用的任何对象。根对象通常是所有AppDomain(即加载的程序集/类型对象)引用的对象、全局和静态对象引用、每个线程各自堆栈上的所有对象引用以及当前加载到CPU寄存器中的任何对象引用

在收集时,GC遍历所有已知根对象的引用,并将沿途找到的任何对象标记为“正在使用”。完成后,可以安全地收集任何未标记的对象

因此,如果根对象未引用任何对象(直接或间接),则是否存在循环引用并不重要。不管怎样,他们都有资格领取。我之所以说合格,是因为GC使用三种不同的策略来收集合格对象,并且出于性能原因,只有其中一种策略在运行时收集所有合格对象

通常情况下,你不必考虑这个问题,它只是起作用。但是垃圾收集还有很多内容,您仍然需要了解它的基本原理,以便理解内存管理和编写不会泄漏资源的无错误代码等。因此,每个.NET开发人员都应该关注它。下面是一些资源,它们详细解释了CLR如何进行垃圾收集