我们有一个多线程客户端 - 服务器项目,我们最近在64位架构上升级了服务器端应用程序。解决了很多问题,我们的应用程序现在可以在繁重的负载下稳定运行。但在此期间之后,服务器上的应用程序崩溃并出现“Out of memory”错误。这时,可用内存大量可用,似乎内存碎片问题。有没有可能对记忆进行碎片整理,有些工具?或者在类似的情况下可能是“内存不足”的其他原因?
内存分配:
答案 0 :(得分:4)
正如你所推测的那样,你的问题就是碎片化。你无法对内存进行碎片整理 - 任何试图这样做的工具都必须拥有程序中每个指针的完整地图。请注意,即使.NET的垃圾收集器无法通过大对象堆实现这一点,我已经崩溃了一个32位的网络应用程序,实际使用的只有100mb。
相反,您需要做的是首先避免碎片。通常,这意味着对象池,保存旧对象以供重用,而不是释放它们,然后重新分配它们。
答案 1 :(得分:3)
另一个选项(如果服务不是时间关键,需要每秒100%在线)是每24小时左右重新启动一次服务(通过任务计划程序或在您自己的程序中)。 / p>
如果在您自己的程序中,您可以通过两种方式之一来执行此操作,具体取决于您拥有的服务类型(如果您的服务实例可能存在两个 - 简短时间):
1) Execute a second instance of your service from within your currently running service and then terminate
2) Execute a tiny helper program that waits f.ex. 5 seconds and then (re)starts your service, then terminate your currently running service
但最好的方法是首先避免碎片化,正如Loren Pechtel写的那样。