【发布时间】:2013-04-06 09:50:05
【问题描述】:
想象一下这段代码:
int i=9999999;
while ( i > 1 )
{
string UnusedMemory="this is a string that eats some ram" + i.ToString();
i--;
}
如果仅在运行GC.Collect() 时才删除未引用的对象,则此代码应分配大量内存,直到发生收集。但它根本没有分配巨大的内存,为什么?是否在 IL 级别实施了某种“删除”?还是GC.Collect() 自动调用更快?我知道这是一个微不足道的例子,但如果它更复杂并且在该代码块中访问字符串,它无论如何也不会吃掉很多内存。
编辑:我更改了示例,使字符串始终是唯一的,因此它不能被“缓存”
【问题讨论】:
-
因为 UnusedMemory 变量是在循环内定义的,所以它只对每次迭代有效。每次迭代后 UnusedMemory 都是 GCd ......我相信,它不会保留它
-
@craig1231 所以你认为每次迭代后都会调用 GC?那个CPU不是很贵吗?
-
@Petr GC 不会在每次迭代中调用。
UnusedMemory被丢弃(实际上可能不是因为它可以被重用),但是字符串本身是一个引用类型,所以它只是在没有任何引用的情况下浮动,并且在 GC 启动时的某个时候被收集。
标签: c#