2012-04-25 169 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執行

  • 內存分析器(有免費並支付最高的)

希望這有助於。