C# 由于未知原因,GC Alloc
我对此有疑问:C# 由于未知原因,GC Alloc,c#,unity3d,memory,memory-management,garbage-collection,C#,Unity3d,Memory,Memory Management,Garbage Collection,我对此有疑问: public void WriteArgs(object[] args) { for (var i = 0; i < args.Length; i++) { Stream.WriteObject(args[i]); } } public void WriteArgs(对象[]args) { 对于(变量i=0;i
public void WriteArgs(object[] args)
{
for (var i = 0; i < args.Length; i++)
{
Stream.WriteObject(args[i]);
}
}
public void WriteArgs(对象[]args)
{
对于(变量i=0;i
它在50个呼叫中分配了2KB。这怎么可能?此方法的哪一部分是分配内存?(在此屏幕上,您可以看到
Stream.WriteObject(args[i]);
正在分配9.4,因此2KB是通过WriteArgs
本身进行分配的)一个大问题是对象[]args
参数中的对象。这看起来像是装箱和拆箱问题
当您调用WriteArgs
函数并向其传递某些内容时,它将执行装箱,以将该参数转换为对象
不确定Stream.WriteObject
是什么或是从哪里得到的,但如果它也将object
作为参数,并且当它进入WriteArgs
函数内部时,它还将执行取消装箱,以便使用传递给它的变量。装箱和取消装箱都分配内存
修复:
删除object[]args
并为WriteArgs
函数创建多个重载,该函数可以将不同的对象类型作为参数处理
另外,如果您编写了Stream.WriteObject
,也可以对其执行相同的操作,或者为其找到替代函数。您可以阅读有关装箱和取消装箱的更多信息
编辑:
上述装箱和拆箱问题仅适用于。如果您已经传递到该函数,那么这里唯一的问题是流.WriteObject
函数。您使用的是一个流,它是一个非托管资源什么类型的流?您为什么关心2KB?您是否在内存受限的环境中运行?它是MemoryStream@mjwills它是每帧每对象,我必须关心每一个字节;)只有当所讨论的对象是值类型时,才会进行装箱和取消装箱。@Servy是的,但我们不知道传递给该函数的是什么。OP在问题中没有显示这一点。但是您说值总是装箱,并且总是取消装箱,这是完全错误的。如果您觉得该问题包含的信息不足,无法发布正确答案,则在该问题澄清到可以回答之前,不要发布答案。谢谢,我无法对您的答案进行投票,但您的怀疑可能是对的,因为“object[]args”包含对象。@Servy您最后的评论没有通知我。注意,我没有像你在评论中提到的那样说“总是”。我只是没有提到我添加的值类型,但这并不意味着“总是”。问题代码+屏幕截图日志中的内容足以让我回答这个问题。阅读如下: