0

我已将我的 c# 控制台应用程序创建为 Windows 服务,并将该服务安装在远程服务器中,该服务器是 32 位机器并具有 2GB RAM。许多客户端连接到此服务器应用程序并从服务器获取数据。问题是有时服务器机器宕机无法访问数据,那个时候我们每次都需要重新启动服务器。我无法确定问题到底出在哪里。当我检查服务器机器中的偶数日志时,我发现了以下异常,

源 .net 2.0 运行时错误。

EventType clr20r3,P1 myapplication.exe,P2 1.3.2.1,P3 4cb724a3,P4 mscorlib,P5 2.0.0.0,P6 4be90358,P7 1947,P8 7,P9 system.outofmemoryexception,P10 NIL。

我用谷歌搜索了很多,但找不到确切的原因。我正在使用 HTTPSERVER.MVC(开源)进行 url 通信。在 main 函数中添加以下代码来创建服务。

 ServiceBase[] ServicesToRun;
 ServicesToRun = new ServiceBase[] 
 { 
   new TouchService() 
  };
 ServiceBase.Run(ServicesToRun);

请有人帮帮我。提前致谢

4

2 回答 2

1

原因是——你内存不足。

在 .Net 中,这并不一定意味着物理上没有更多内存,它只是意味着 CLR 无法找到足够的连续内存来分配某些东西。这可能是由于已经分配了大量内存,或者由于内存碎片。

在不了解您的应用程序的情况下,很难给出一般性建议,但有几点建议是:

  • 尝试使用 Windows 性能计数器和Process Monitor等工具监控堆的大小
  • 查看您的代码 - 您是否无限期地保留引用并不断增加正在使用的内存的整体大小?
  • 您是否分配了大约 80KB 以上的任何大的单个内存块,例如大数据字符串?像这样的大对象是在大对象堆上分配的,而不是压缩的,这会导致碎片和 OutOfMemoryExceptions?
  • 您是否尝试过使用内存分析器?(我倾向于使用SciTech 的 .Net Memory Profiler,但还有其他好的)。这使您可以启动服务并附加分析器,做一些工作,拍摄快照,再做一些工作,然后查看快照之间的差异。这是一种非常有效的方法来发现内存使用是否以及为什么会逐渐增加。
  • 你在做很多 XML 序列化吗?除了倾向于生成大字符串(参见前一点)之外,在 XmlSerializer 构造函数上使用某些重载还会导致每次使用新的 xml 序列化 dll 并将其加载到应用程序池中。

这些只是一些随意的想法,但如果您还没有,我建议您对 CLR 内存管理和垃圾收集有一个基本的了解,尝试一些监视和分析,并仔细查看您的代码。

于 2012-04-25T10:06:20.890 回答
0

理解这一点的唯一可能方法是衡量您的服务内存使用情况。将其转换为“普通”应用程序,并且

  • 首先尝试使用Process Explorer。让您的应用程序遵循ma有繁重工作量的路径并查看WorkingSet:它如何增长,如果它能够在 GC 执行后恢复其状态(尽可能多)

  • 使用一种可用的内存分析器(有免费和付费的)

希望这可以帮助。

于 2012-04-25T10:10:08.573 回答