提高.Net内存速度和效率

时间:2013-04-05 13:17:34

标签: c# .net memory-management garbage-collection

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

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

现在,一些聊天(其他请求)阻止了大处理请求,这可能需要几秒钟。

我想要做的是,当聊天(较小的请求)开始时,对.Net框架说:转到Windows,并获得几GB的内存,以便在我问的时候可以更快地使用它,当我完成后,对.Net说:我目前没有使用的所有内容,你可以回馈,因为我暂时不需要它。


我正在开始进行剖析......但我怀疑它会成为可以改善的问题的一部分。

我会试着澄清一下情况。

我有一个位于服务器上的服务,95%的时间都没有做任何事情。很长一段时间后,它会收到执行大部分内存密集型处理的请求。

我事先知道一点时间,这一切都会发生。

所有我想做的,是暗示GC“很快就会需要大量的内存”,后来“一段时间内不需要任何特别的东西”


行。 我做了剖析,并决定我不关心这个。 分配确实需要一些时间(几到几十毫秒),但与处理的其余部分无关......

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

2 个答案:

答案 0 :(得分:1)

如果您希望能够为您的使用预留一块内存,请参阅:

allocating "unmanaged" memory in c#

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

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

请参阅:Weak reference benefits

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

答案 1 :(得分:0)

GC大部分时间足够智能,可以为您完成此操作。但是,这是一个架构问题,可以通过修改服务中的活动流来处理。

e.g。您可以在请求到来之前预先分配处理大请求所需的对象。但是,对于解除分配,要么明确地为它们实现idisposible接口,要么在使用它们之后销毁它们或将它留给GC。

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

考虑到详细信息,我会说,即使您可以成功执行此例程,它也会变得更加复杂,并且可能会为您的代码添加更多错误。最好把它留给.Net框架。它非常擅长分配和释放内存。