Delphi XE4 64位内存不足

时间:2013-12-26 05:20:09

标签: delphi memory-management out-of-memory delphi-xe4

我们有一个多线程客户端 - 服务器项目,我们最近在64位架构上升级了服务器端应用程序。解决了很多问题,我们的应用程序现在可以在繁重的负载下稳定运行。但在此期间之后,服务器上的应用程序崩溃并出现“Out of memory”错误。这时,可用内存大量可用,似乎内存碎片问题。有没有可能对记忆进行碎片整理,有些工具?或者在类似的情况下可能是“内存不足”的其他原因?

内存分配:

  1. 总内存量:96Gb
  2. 物理:48Gb
  3. 虚拟:48Gb
  4. 崩溃时的可用物理内存量:3GB
  5. 崩溃时的可用虚拟内存量:45Gb
  6. 每个线程分配的最大内存大小:1GB

2 个答案:

答案 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写的那样。

相关问题