这张照片中的[垃圾收集]是什么意思?和“20个电话”的事情?
我的意思是,我怎么能弄清楚为什么GC花了这么长时间?它收集了很多小物件吗?一个大的?关于如何优化这一点的任何提示?
有问题的代码是:
private void DeserializeFrom(SerializationInfo info)
{
Width = info.GetInt32("width");
Height = info.GetInt32("height");
var data = (List<byte>)info.GetValue("cells", typeof(List<byte>));
cells = new Cell[physicalSize.Width, physicalSize.Height];
int pos = 0;
for (int x = 0; x < physicalSize.Width; x++)
{
for (int y = 0; y < physicalSize.Height; y++)
{
cells[x, y] = new Cell();
if (x < Width && y < Height)
{
cells[x, y].HasCar = data[pos];
pos++;
}
}
}
}
没什么太花哨的。我怀疑罪魁祸首是大List<byte>
个对象,但我认为收集一个单个,大对象应该是即时的(而不是收集一堆小对象)。
答案 0 :(得分:2)
如果您想了解导致GC的原因,正在分配和收集哪些对象,您可以通过dotMemory来完成。这是一个解释如何优化内存流量的教程:https://confluence.jetbrains.com/display/NETCOM/Tutorial+3+-+How+to+Optimize+Memory+Traffic+with+dotMemory
答案 1 :(得分:1)
派对有点晚,但如果你使用.Net,那么你使用托管代码,这基本上意味着.Net运行时相应地处理你的对象,所以你没有内存泄漏而不是C或C ++。
垃圾收集是指运行时花费一些时间来管理应用程序的内存分配和释放。在这种情况下,正在发生的事情。
请查看可与doTrace一起使用的此过滤器(我有版本6),以便您可以分析垃圾收集并确定何时可能阻止执行。 https://www.jetbrains.com/profiler/help/CLR_Activity.html