0

Windowsサービスとしてc#コンソールアプリケーションを作成し、32ビットマシンで2GBのRAMを搭載したリモートサーバーにサービスをインストールしました。このサーバーアプリケーションには、多くのクライアントが接続されており、サーバーからデータを取得します。問題は、サーバーマシンがダウンしていてデータにアクセスできないことです。その場合は、毎回サーバーを再起動する必要があります。問題がどこにあるのか正確に特定できません。サーバーマシンのevenlogsをチェックしていたときに、以下の例外が見つかりました。

source.net2.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、P10NIL。

私はたくさんグーグルで検索しましたが、正確な理由を見つけることができません。URL通信にHTTPSERVER.MVC(オープンソース)を使用しています。以下のサービスを作成するには、メイン関数にコードを追加します。

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

誰か助けてください。前もって感謝します

4

2 に答える 2

1

理由は-あなたはメモリ不足です。

.Netでは、これは必ずしも物理的にメモリがなくなったことを意味するのではなく、CLRが何かを割り当てるのに十分な連続したメモリを見つけることができなかったことを意味します。これは、すでに大量のメモリが割り当てられているか、メモリの断片化が原因である可能性があります。

アプリケーションについて詳しく知らなければ、一般的なアドバイス以上のものを提供することは困難ですが、いくつかの指針は次のとおりです。

  • WindowsパフォーマンスカウンターやProcessMonitorなどのツールを使用して、ヒープのサイズを監視してみてください
  • あなたのコードを見てください-あなたは無期限に参照を保持し、終わりなく使用されているメモリの全体的なサイズを増やしていますか?
  • たとえば、データの大きな文字列など、約80KBを超える大きな単一ブロックのメモリを割り当てていますか?このようなラージオブジェクトはラージオブジェクトヒープに割り当てられ、圧縮されないため、断片化やOutOfMemoryExceptionsが発生する可能性がありますか?
  • メモリプロファイラーを使用してみましたか?(私はSciTechの.Net Memory Profilerを使用する傾向がありますが、他にも優れたものがあります)。これにより、サービスを開始してプロファイラーをアタッチし、いくつかの作業を行い、スナップショットを作成し、さらにいくつかの作業を行ってから、スナップショット間の違いを確認できます。これは、メモリ使用量が増加している場合とその理由を特定するための非常に強力な方法です。
  • 多くのXMLシリアル化を行っていますか?大きな文字列を生成する傾向(前のポイントを参照)とは別に、XmlSerializerコンストラクターで特定のオーバーロードを使用すると、新しいxmlシリアル化dllが生成され、使用されるたびにアプリケーションプールにロードされる可能性があります。

これらはいくつかのランダムな考えですが、CLRメモリ管理とガベージコレクションについてまだ理解していない場合は、基本的な理解を深め、監視とプロファイリングを試して、コードを批判的に検討することをお勧めします。

于 2012-04-25T10:06:20.890 に答える
0

それを理解する唯一の可能な方法は、メモリ使用量を処理する手段です。それを「通常の」アプリケーションに変換し、

  • 最初にProcessExplorerを使用してみてください。アプリケーションに、ワークロードが重いパスをたどり、GCの実行後に(可能な限り)状態を回復できるかどうかを確認しますWorkingSet

  • 利用可能なメモリプロファイラーの1つを使用します(無料のものと有料のものがあります)

お役に立てれば。

于 2012-04-25T10:10:08.573 に答える