我有一个服务,我在很长一段时间内查询一次,我想“简化”或提高其内存分配的效率。
大部分时间它只是坐着等待,偶尔它会得到一个请求,需要分配一个很多的内存,然后对它进行一些处理。我事先不知道类型或结构 - 这取决于要求,并且变化很大。
现在,一些聊天(其他请求)阻止了大处理请求,这可能需要几秒钟。
我想要做的是,当聊天(较小的请求)开始时,对.Net框架说:转到Windows,并获得几GB的内存,以便在我问的时候可以更快地使用它,当我完成后,对.Net说:我目前没有使用的所有内容,你可以回馈,因为我暂时不需要它。
我正在开始进行剖析......但我怀疑它会成为可以改善的问题的一部分。
我会试着澄清一下情况。
我有一个位于服务器上的服务,95%的时间都没有做任何事情。很长一段时间后,它会收到执行大部分内存密集型处理的请求。
我事先知道一点时间,这一切都会发生。
所有我想做的,是暗示GC“很快就会需要大量的内存”,后来“一段时间内不需要任何特别的东西”
行。 我做了剖析,并决定我不关心这个。 分配确实需要一些时间(几到几十毫秒),但与处理的其余部分无关......
关于释放部分,它最终会发生,并不会真正干扰服务器的其余部分......
答案 0 :(得分:1)
如果您希望能够为您的使用预留一块内存,请参阅:
allocating "unmanaged" memory in c#
请注意,这样做可能会有风险,并且.NET VM中的垃圾收集器和内存分配已经相当不错了。
如果可以在很大程度上缓存内存分配,那么我建议使用WeakReference
缓存可以执行的操作,以便快速连续请求可以从访问缓存数据中受益,但是如果请求之间存在垃圾收集间隔相当大的数量,然后可以释放数据,并在下一个请求中重新创建。
并且:http://msdn.microsoft.com/en-gb/library/system.weakreference.aspx
答案 1 :(得分:0)
GC大部分时间足够智能,可以为您完成此操作。但是,这是一个架构问题,可以通过修改服务中的活动流来处理。
e.g。您可以在请求到来之前预先分配处理大请求所需的对象。但是,对于解除分配,要么明确地为它们实现idisposible接口,要么在使用它们之后销毁它们或将它留给GC。
此外,您必须了解内存分配的工作原理。为了获得为.Net对象分配的内存,您必须事先知道对象的类型。只分配普通的内存块对你没有任何帮助。大多数情况下,与框架用于为对象分配内存的malloc相比,对象创建或克隆代码更耗费资源。
考虑到详细信息,我会说,即使您可以成功执行此例程,它也会变得更加复杂,并且可能会为您的代码添加更多错误。最好把它留给.Net框架。它非常擅长分配和释放内存。