![]() |
1
6
记住,对象和变量不是一回事。A.
对特定的方法或类型有作用域,但它所指或用来指的对象没有这样的概念;只是一团记忆。如果GC在
“可达”(而不是“需要”)是这里的关键词。此行之后不再需要数组对象:
我们还需要记住,它不是立即收集的。只是
待收集。作为一个实际问题,我发现.NET运行时不倾向于在用户方法的中间调用GC,除非它真的必须如此。
|
![]() |
2
4
把我在下面引用的博文的一部分应用到你的问题中,答案如下:
JIT通常非常聪明,能够意识到这一点
更多信息请访问 To Null or Not to Null |
![]() |
3
3
请注意,有些源混淆了对象终结器的触发与垃圾回收,但终结器被触发的对象保证至少在终结器执行所需的时间内继续存在,并且如果终结器完成执行时存在对它的任何引用,则该对象可能会无限期地继续存在。
一个关键的观察结果是,虽然终结器和弱引用稍微使事情复杂化,但GC销毁对象的唯一方法是使弱引用形式无效。就GC而言,当系统没有实际执行GC循环时,唯一存在的存储类型是由存在的对象使用的存储类型、用于.NET内部目的的存储类型以及可用于满足未来分配的存储区域。如果创建了一个对象,它所占用的存储将不再是可供将来分配的存储区域。如果该对象后来不再存在,则 存储 包含该对象的对象也将不再以GC知道的任何形式存在,直到下一个GC周期。下一个GC周期不会销毁对象(它已经不存在了),而是将包含它的存储添加回可用于添加未来分配的区域列表(使该存储再次存在)。 |
![]() |
A B · C#Excel自动调整列避免长文本时出错 3 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 3 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 3 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 4 月前 |