GC Alloc原因不明

时间:2017-10-17 11:46:23

标签: c# unity3d memory memory-management garbage-collection

我有这个问题:

visibleObject.visibleCallableSub (aCustomCollection), False

它在50个电话(screen)上分配2 KB。怎么可能?这种方法的哪一部分是分配内存? (在此屏幕上,您可以看到 public void WriteArgs(object[] args) { for (var i = 0; i < args.Length; i++) { Stream.WriteObject(args[i]); } } 正在分配9.4,因此2KB由Stream.WriteObject(args[i]);本身分配)

1 个答案:

答案 0 :(得分:1)

一个很大的疑问是object参数中的object[] args。这看起来像拳击和拆箱问题。

当您调用WriteArgs函数并向其传递内容时,它会执行装箱以将该参数转换为object

不确定Stream.WriteObject是什么或者你得到了什么,但如果它也是object作为参数,当它进入WriteArgs函数时,它也会执行取消装箱以便使用传递给它的变量。 拳击取消装箱都会分配内存。

<强> FIX

删除object[] args并为您的WriteArgs函数创建多个重载,这些重载可以处理不同的Object类型作为参数。

另外,如果您编写它或为其找到替代函数,请对Stream.WriteObject执行相同操作。您可以详细了解拳击取消装箱 here

修改

上述装箱和拆箱问题仅适用于Value Types。如果您已将Reference Type传递给该函数,则此处唯一的问题是Stream.WriteObject函数。