2017-10-17 187 views
0

我有问题,这样的:GC的Alloc由于未知原因,

​​

它是在50元话费(screen)分配2 KB。这怎么可能?这种方法的哪一部分是分配内存? (在此屏幕上的SAN看到Stream.WriteObject(args[i]);被分配9.4使2KB由WriteArgs本身分配)

+0

那么你正在使用'Stream'这是一个非托管资源 – Rahul

+0

Stream是什么类型? – Polyfun

+0

你为什么要关心2KB?你是否在内存受限的环境中运行? – mjwills

回答

1

一个很大的嫌疑是在你的object[] args参数object。这看起来像是一个装箱和拆箱问题。

当您调用WriteArgs函数并传递一些信息时,它会执行装箱将该参数转换为object


不知道什么Stream.WriteObject是或者说你有,但如果它需要object作为参数也是一样,当它的WriteArgs功能进入里面,它还会以使用传递的变量进行拆箱到它。 拳击拆箱分配内存。

FIX

删除object[] args,并为您的WriteArgs功能,可以处理不同类型的对象作为参数多个重载。

另外,如果您为它编写了代码或找到替代函数,请执行Stream.WriteObject。你可以阅读更多关于拳击拆箱here

编辑:

拳击以上仅适用于Value Types描述拆箱问题。如果您已经将Reference Type传递给该函数,那么这里唯一的问题是Stream.WriteObject函数。

+0

只有当所讨论的对象是值类型时才会进行装箱和取消装箱。 – Servy

+1

@Servy是的,但我们不知道传递给该函数的是什么.OP没有在问题中显示。 – Programmer

+0

然而你说,价值是*永远*盒装,和*永远*拆箱,这是完全错误的。如果您觉得该问题没有足够的信息发布正确的答案,那么*不要发布答案*直到问题能够被澄清到足以应付。 – Servy