0

C# で記述されたアプリで何が起こっているのかを理解しようとしています。以下は、パフォーマンス モニターから取得したいくつかの画像です。青い線は、すべてのヒープの #Bytes です。緑の線はラージ オブジェクト ヒープ サイズです。アプリを起動してログインします。アプリはアイドル状態のままです。最初の画像は、何らかの理由で LOH が増加し、その後低下することを示しています。パターンは非常に明確です。そのような行動の責任は何ですか?

ここに画像の説明を入力

もっと。ODP.NET を介して Oracle データベースを使用して、A (下の画像を参照) で始まるいくつかの重い処理を行います。その後、アプリは再びアイドル状態になります。LOH はドロップしません。代わりに、何らかの理由で増加し続けます。アプリケーションがアイドル状態であることに注意してください。デスクトップで開いているだけです。私はそれと対話していません。

ここに画像の説明を入力

メモリは増加し続けます (各画像は 1:15:00 を表します)。

ここに画像の説明を入力

2 時間以上経過すると、急激に減少し、しばらくすると、最初の画像のように再び増加/減少し始めます (以下を参照)。アプリは常にアイドル状態です。何が起こっている?メモリリークですか?私はそうは思わない。アプリのプロファイルを作成しましたが、何も見つかりませんでした。また、LOH は何もしなくても増加します。Oracle データベースとの開いている接続がありません。ODP.NET が原因でしょうか?

ここに画像の説明を入力

4

1 に答える 1

0

問題は間違いなく ODP.NET によるものです。接続プールを無効にすると、問題は発生しません。接続ごとに、ODP.NET は 2 つのスレッドを作成し、3 分間隔で (画像に見られるように) ODP.NET はいくつかのハウスキーピングを行いますが、何らかの理由ですぐに解放されないメモリを割り当てます。

再現は簡単です。ボタンを押すと Oracle データベースへの接続が開かれ、ストアド プロシージャが実行される単純なアプリを作成するだけです。最初の画像のパターンに気付くでしょう。他の画像のパターンは、アプリによって作成された接続の数によるものです。

于 2011-08-01T14:09:29.750 に答える