我注意到当我运行这段代码时:
{
int[] a = new int[int.MaxValue / 8];
}
{
int[] a = new int[int.MaxValue / 8];
}
我得到OutOfMemoryException。但如果我这样做:
{
int[] a = new int[int.MaxValue / 16];
}
{
int[] a = new int[int.MaxValue / 16];
}
{
int[] a = new int[int.MaxValue / 16];
}
{
int[] a = new int[int.MaxValue / 16];
}
没有例外。但是当我更改2个变量的名称时:
{
int[] a = new int[int.MaxValue / 16];
}
{
int[] a = new int[int.MaxValue / 16];
}
{
int[] b = new int[int.MaxValue / 16];
}
{
int[] b = new int[int.MaxValue / 16];
}
我再次得到OutOfMemoryException。
为什么在第一次和最后一次出现OutOfMemoryException而不是第二次使用相同数量的空间?
编辑:我明白第一个OutOfMemoryException是不同的,因为内存需要是连续的,但不是为什么第二个没有OutOfMemoryException但是第三个
这是一个很好的问题,我不确定我是最好的回答,但我会试一试。
数组要求内存是连续的,这意味着它必须彼此相邻。因此,当你要求2个int.max / 8或大约5亿个整数数组时,你说我需要彼此相隔25亿个内存块,而不仅仅是10亿个内存块。当你再询问4个2.5亿个块时,这是同样的事情,你仍然要求10亿块内存但是在4 250个块中。至于为什么第三个失败了...这可能只是运气不好或垃圾收集器只是慢......不太确定。一旦你离开块就应该释放那个内存,所以命名它不一样真的很重要,虽然可能给它相同的变量名强制集合......我不是垃圾收集专家。
变量名不影响内存,编译器实际上并不保存原始变量名。