0

我有一项服务,我会在很长一段时间内查询一次,我想“简化”或提高其内存分配的效率。

大多数时候它只是坐着等待,偶尔它会收到一个需要分配大量 内存的请求,并对其进行一些处理。我事先不知道类型或结构 - 这取决于请求,并且变化很大。

现在,大处理请求被一些喋喋不休(其他请求)排除,这可能需要几秒钟。

我想要做的是,当喋喋不休(较小的请求)开始时,对 .Net 框架说:转到 Windows,并为自己获取几 GB 的内存,这样当我询问时它会更快可用,当我完成了,对 .Net 说:我目前没有使用的所有东西,你可以还给我,因为我暂时不需要它。


在我们说话时,我开始进行分析……但我怀疑这将是可以改进的问题的一部分。

我会尽力澄清情况。

我有一个位于服务器上的服务,95% 的时间什么都不做。偶尔它会收到一个请求来做一些主要是内存密集型的处理。

我提前一点时间知道这一切都会发生。

我想做的只是提示 GC“很快将需要大量内存”,然后“暂时不需要任何特别的东西”


好的。我已经完成了分析,并决定我不在乎这个。分配确实需要一些时间(几到几十毫秒),但与其他处理相比微不足道......

关于发布部分,它最终会发生,并且不会真正干扰服务器的其余部分......

4

2 回答 2

1

如果您希望能够保留一块内存供您使用,请参阅:

在 C# 中分配“非托管”内存

请注意,这样做可能会有风险,并且 .NET VM 中的垃圾收集器和内存分配已经相当不错了。

如果内存分配可以在很大程度上被缓存,那么我建议缓存可以这样做的内容,以便WeakReference快速连续的请求可以从访问缓存的数据中受益,但是如果在间隔相当大的请求之间进行垃圾收集,那么数据可以释放并在下一个请求中重新创建。

请参阅:弱参考优势

并且:http: //msdn.microsoft.com/en-gb/library/system.weakreference.aspx

于 2013-04-05T13:23:39.963 回答
0

大多数时候 GC 足够聪明,可以为您执行此操作。但是,这是一个架构问题,可以通过修改服务中的活动流来解决。

例如,您可以在请求到来之前提前分配处理大请求所需的对象。但是,对于解除分配,要么显式地为它们实现不可分配接口,并在它们被使用后销毁它们,要么将其留给 GC。

此外,您必须了解内存分配的工作原理。为了获得为 .Net 对象分配的内存,您必须提前知道对象的类型。仅仅分配一块普通的内存对你没有任何帮助。大多数情况下,与框架用于为对象分配内存的 malloc 相比,对象创建或克隆代码更消耗资源。

考虑到细节,我想说即使你能成功地完成这个例程,它也会变得更加复杂,并且可能会给你的代码添加更多的错误。最好把它留给 .Net 框架。它非常擅长分配和释放内存。

于 2013-04-05T13:23:48.733 回答