2012-04-25 90 views
0

我已经创建了我的C#控制台应用程序作为Windows服务,并将服务安装在32位计算机的远程服务器上,并具有2GB RAM。 对于此服务器应用程序,许多客户端都连接并从服务器获取数据。 问题是有时服务器机器停机并且无法访问数据,那时我们需要每次都重新启动服务器。我无法确定问题出在哪里。 当我检查服务器机器evenlogs时,我发现以下例外,.net windows服务

源.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(opensource)进行网址通信。 要在代码中创建服务,请在主函数中添加。

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

请帮我一把。 在此先感谢

+2

我认为你的内存不足...... – zmbq 2012-04-25 10:01:48

+0

这可能是什么原因,或者我该如何解决。如果有任何指导方针,请告诉我。 – user703526 2012-04-25 10:03:45

回答

1

原因是 - 你是内存不足。

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

不知道更多关于你的应用是很难给出比一般建议多,但有几个指针:

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

这些只是一些随机的想法,但如果您还没有,我会建议您获得a basic understanding of CLR memory management and garbage collection,尝试一些监控和分析,并仔细查看您的代码。

+0

我的应用程序使用HTTPSERVER.MVC..client应用程序向服务器发送数据请求,并从服务器获取数据并将其存储到数据库中,与客户端进行通信。使用的数据库是sqlite。 – user703526 2012-04-25 10:12:01

+0

string remoteThingXml = touchServerClient.SendRequest(“/ item/detail /”+ remoteThing.id +“?lang =”+ ThingzDatabase.lang2 +“”, null, WebRequestMethods.Http.Get, null); – user703526 2012-04-25 10:13:11

+0

返回的xml有多大,之后做了什么? – 2012-04-25 10:14:18

0

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

  • 第一次尝试使用Process Explorer。让你的应用程序遵循的路径毫安有繁重的工作,并期待在WorkingSet:如何增长,如果它能够恢复其状态(就像它可能)利用现有的一个后GC执行

  • 内存分析器(有免费并支付最高的)

希望这有助于。