web-dev-qa-db-ja.com

web.configのdebug = true =悪いこと?

多くの仮想メモリの断片化とメモリ不足エラーが発生し、3GBの制限に達しました。

コンパイルデバッグはweb.configでtrueに設定されていますが、私が尋ねるすべての人から異なる回答が得られます。デバッグをtrueに設定すると、各aspxがRAMのランダムな領域にコンパイルされ、RAMが断片化され、最終的にメモリ不足の問題が発生しますか?

52
MateloT

Scott Guthrie(ASP.NET開発チームのマネージャー)には それに関する興味深い投稿 があります。

debug="true"を残してはならない最も重要なポイントは次のとおりです。

  1. ASP.NETページのコンパイルには時間がかかります(一部のバッチ最適化が無効になっているため)
  2. コードの実行が遅くなる可能性があります(追加のデバッグパスが有効になっているため)
  3. 実行時にアプリケーション内でより多くのメモリが使用されます
  4. WebResources.axdハンドラーからダウンロードされたスクリプトと画像はブラウザーによってキャッシュされないため、クライアントとサーバー間のリクエストが増えます

彼はmachine.configの<deployment retail=”true”/>フラグにも言及しています。これにより、マシン(実稼働サーバーなど)で実行されているすべてのアプリケーションのdebug = "true"フラグをグローバルにオーバーライドできます。


Updatedebug="true"を使用したWebアプリのデプロイは、 Scott Hanselmanの最近のブログ投稿

Debug = "true"が悪い理由は次のとおりです。真剣に、私たちは冗談ではありません。

  • リクエスト実行タイムアウトをオーバーライドして、事実上無限にします
  • ページとJITコンパイラーの両方の最適化を無効にします
  • 1.1では、CLRがデバッグ情報の追跡のためにメモリを過剰に使用します。
  • 1.1では、動的ページのバッチコンパイルをオフにして、ページごとに1つのアセンブリを作成します。
  • VB.NETコードの場合、WeakReferencesの過剰な使用につながります(編集および継続サポートに使用)。

重要な注意:時々信じられていることとは反対に、要素にretail = "true"を設定することは、debug = "true"を持つことに対する直接的な解毒剤ではありません!

77
M4N

アプリケーションを実際にデバッグする必要がない限り、web.configでデバッグフラグをfalseに設定する必要があります。

デバッグモードで実行すると、メモリ使用量が多少増加する可能性がありますが、あなたが話しているほど深刻な問題ではないでしょう。ただし、その効果を除去するためにfalseに設定し、改善が見られるかどうかを確認する必要があります。

デバッグモードで実行すると、ガベージコレクションの動作が異なります。変数の有効期間は、実際の使用から変数のスコープに拡張されます(デバッガーで値を表示できるようにするため)。これにより、一部のオブジェクトはガベージコレクションされるまでの期間が長くなります。

コンパイラは、デバッグモードでコンパイルするときにコードを最適化しません。また、いくつかの余分なnop命令が追加され、各コード行にブレークポイントを配置できる命令が少なくとも1つ含まれます。

デバッグモードでは、例外のスローにかなり時間がかかります。 (ただし、通常、コードはそれほど頻繁に例外をスローすべきではありません。)

13
Guffa

それは絶対にメモリに影響を与える可能性があり、perfmonカウンタのいくつかを見て、両方の構成との比較を実行するだけです。

サイトに多くのファイルがある場合は、asp.net tempフォルダーのディスクioに関心があります。

カップルの質問...

  1. App_Codeに多くのファイルがありますか?
  2. サイトの更新を許可していますか、それとも公開していますか?
  3. その場合、サイトは頻繁に更新されていますか、または展開プロセスがありますか?
  4. ハードウェア構成とは何ですか?

複数の構成を利用しないのはなぜですか?

Web.Debug.Config-デバッグを有効にするWeb.UAT.Config-好みに応じてWeb.Release.Config-デバッグを無効にする

このようにして、debug = "true"でweb.configをチェックインする開発者のような回帰構成エラーを最小限に抑えることができます。

4
sqlray

AFAIK "debug = true"は、あなたが言及した状況を引き起こしません。

その場で画像を作成するASP.NETアプリケーションでも同じ問題に直面していました。

廃棄されていないリソースに問題があると思います。

分離コードファイルを含むaspxファイルをサーバーに展開する場合。要求がaspxに届くと、一度コンパイルされます。その後、ファイルが変更されるまでキャッシュに保存されます。

3
Canavar

実稼働システムでは、常にDebug = falseを設定します。フラグが示唆するように、開発システムをデバッグする場合にのみtrueに設定する必要があります。

このフラグは、メモリの断片化の問題とは関係ありません。

0
David