另请参阅这些相关资源:
- .NET 垃圾收集器是否执行代码预测分析? https://stackoverflow.com/questions/3161119/does-the-net-garbage-collector-perform-predictive-analysis-of-code(在堆栈溢出上)
- WP7:GC何时将局部变量视为垃圾 https://learn.microsoft.com/en-us/archive/blogs/abhinaba/wp7-when-does-gc-consider-a-local-variable-as-garbage?wa=wsignin1.0(MSDN 上的博客文章)
换句话说:
一个对象可以被本地引用吗
变量在之前被回收
变量超出范围(例如
因为变量已被赋值,但是
然后不再使用),或者是这样
保证不符合条件的对象
垃圾收集直到变量
超出范围?
让我解释:
void Case_1()
{
var weakRef = new WeakReference(new object());
GC.Collect(); // <-- doesn't have to be an explicit call; just assume that
// garbage collection would occur at this point.
if (weakRef.IsAlive) ...
}
在这个代码示例中,我显然必须计划新版本的可能性object
被垃圾收集器回收;因此if
陈述。
(请注意,我正在使用weakRef
唯一的目的是检查新的object
仍然存在。)
void Case_2()
{
var unusedLocalVar = new object();
var weakRef = new WeakReference(unusedLocalVar);
GC.Collect(); // <-- doesn't have to be an explicit call; just assume that
// garbage collection would occur at this point.
Debug.Assert(weakRef.IsAlive);
}
此代码示例与前一个代码示例的主要变化是新的object
被局部变量强引用(unusedLocalVar
)。然而,这个变量在弱引用之后再也不会被使用(weakRef
) 已经被创造了。
问题:是否允许符合标准的 C# 编译器优化前两行Case_2
进入那些Case_1
如果它看到了unusedLocalVar
只用在一个地方,即作为WeakReference
构造函数?即是否有可能断言Case_2
可能会失败吗?
C# 编译器做什么并不重要 - 一旦本地引用在方法体中不再存在,JITter/GC 就可以清理它们。查看文档GC保持活动 http://msdn.microsoft.com/en-us/library/system.gc.keepalive.aspx
还有,这个PowerPoint演示文稿 http://download.microsoft.com/download/e/2/1/e216b4ce-1417-41af-863d-ec15f2d31b59/DEV490.ppt,特别是从幻灯片 30 开始,有助于解释 JIT/GC 可以做什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)