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您最后的评论没有通知我。注意,我没有像你在评论中提到的那样说“总是”。我只是没有提到我添加的值类型,但这并不意味着“总是”。问题代码+屏幕截图日志中的内容足以让我回答这个问题。阅读如下: