問題タブ [handle-leak]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 特に Click イベントの処理時に WebBrowser コントロールがメモリ リークを起こす
私は Windows 7、.NET 4.5、IE10 を使用しています。コントロールを持つ単純な Windows フォーム アプリケーションがありますWebBrowser
。ページが移動するたびに、クリック ハンドラーを追加したいと考えています。これを行うと、メモリがリークしていることに気付きました。私は実際にイベント ハンドラーをデタッチしているので、なぜメモリ リークが発生するのか混乱しています。
HtmlDocument.Click
イベントにアタッチでき、 に関連するリークが表示されないことに気付きましたHtmlElement.Click
。これは、タイマーを使用して定期的にナビゲートする以下のプログラムで実証されています。
また、興味深いのは、URL が重要であるように思われることです...たとえば、http://www.google.com には問題がありますが、http://thin.npr.org (または about:blank) には問題がありません。これにより、これは根本的にJavaScriptの問題であると信じるようになりますが、現在採用している「修正」(以下を参照)は実際にはJavaScriptとは何の関係もありません...
では、問題の原因と、プログラムがメモリ/ハンドルをリークしないように問題を回避するにはどうすればよいですか?
私の現在の「修正」はMarshal.ReleaseComObject
、HtmlElement.DomElement
プロパティを呼び出すことです。これは正しいことですか?どうやらそうHtmlElement
であるように、それ自体を片付けるべきではありませんか?HtmlDocument
に加えて、他のクラスの問題を予期する必要がありHtmlElement
ますか?
Marshal.ReleaseComObject
私は、com オブジェクトが見えるところならどこにでも惜しみなく振りかけたいと思っています (それを含むクラスが適切にそうするとは限りません)。それは安全なことですか?
私の完全なプログラムは次のとおりです。
好奇心旺盛な人のために、プログラム内WeakReference
のオブジェクトに a を使用してテストを行いbody
、それがガベージ コレクションされていることを確認しました。
「修正済み」バージョンをしばらく (おそらく 1 時間) 実行した後、約 40 MB のプライベート バイトと 640 ハンドルで安定しています。「リーキー」バージョンは、最大で数百メガバイト、数千ハンドルになり、速度が低下しているようには見えません。本番環境では、機能が停止したとき (画像が読み込まれない)、900 MB を超えるプロセスを使用していたユーザーがいました。アプリケーションを閉じると、すべてが破棄されるまでに数秒かかりました。
bash - bashのサブプロセス間で変数がリークする
こんにちは、stackoverflow の皆さん 親スクリプトとの変数の競合により、子として実行されている bash スクリプトに問題があります。親から変数を開始してプルするサブプロセスがあります。私が行っていることは、毎秒同時に実行される子プロセスのそれぞれの中で、変数が子の間でクロスオーバーするということです。たとえば、UnitIP UnitPort と Unitname はすべて配列から定義されていますが、次の子が開くと、他の子も unitip unitPort などに加えられた変更を受け取ります...この問題の解決策はありますか? つまり、UnitIP=${IP[0]} の子が UnitIP=${IP[0]} で開かれ、ループが UnitIP=${IP[1]} の周りに戻ってきたとします。2 番目の子は UnitIP=${IP[1] で開きます。 ]} そして最初の子も UnitIP=${IP[1]} に変わります。
c# - C# PerformanceCounter クラスが原因でハンドル リークが発生する
.NET 4.0 で開発されたアプリケーションがあります。このアプリケーションは、いくつかのカスタム パフォーマンス カウンターを追跡し、ユーザーに表示します。最近、アプリケーションにハンドル リークがあることがわかりました。Mutant と PcwObject の 2 種類のハンドルがあります。
このページ ( http://blogs.technet.com/b/yongrhee/archive/2011/12/19/how-to-troubleshoot-a-handle-leak.aspx ) をたどり、次のスタック トレースを取得しました。
と
また、ハンドルの状態を監視するために Process Explorer も開きました。私の観察によると、上記の 2 つのハンドル (3760 と 3998) は 30 分以上存続し、まだ破壊されていません。ハンドル数は 2 時間以内に最大 1000 増加します。それらの半分は Mutant で、残りの半分は PcwObject です。
PerformanceCounter coz に関連していると思われます。レジストリからの PerformanceCounter クラスの grep データを知っており、スタック トレースで PerflibciQuery と RegQueryValue を見つけました。
インターネットで検索しましたが、うまくいかないようです。誰かこれについて何か考えがありますか?ありがとう
追加情報
これらのパフォーマンス カウンターを 1 つずつテストしたところ、このカウンターを取得するときにこれらのハンドルがリークしていたことがわかりました。PerformanceCounter("HTTP Service Request Queues", "CurrentQueueSize", "ABC")
私のコードは次のようなものです:
counter
はメンバー変数であり、このクラスが破棄されると破棄されると確信しています。だから、ハンドルが漏れる理由がわかりません。
memory-leaks - 「!htrace -diff」結果でスタック トレースのすべてのフレームを取得するにはどうすればよいですか?
「!htrace -diff」では 16 フレームしか表示できないようです。スタック トレースのフレーム数を増やすにはどうすればよいですか? 以下は、!htrace -diff によって検出されたリークされたハンドルの 1 つです。完全なスタック トレースがないと、何も読み取れません。
c++ - CreateFileMapping、MapViewOfFile、C++ リークの処理
背景:複数のプロセスからアクセスできるメモリ マップ ファイルを作成しようとしています。以下のコードでは、現在の質問に関連するコードのみを入れて、物事を単純化しています。msdn によると、ファイルマップを作成し、ファイルのビューをマップし、CreateFileMapping から受け取ったハンドルを閉じることができ、MapViewOfFile は FileMap を維持します。UnmapViewOfFile.
MSDN: CreateFileMapping 関数
ファイル マッピング オブジェクトのマップされたビューは、オブジェクトへの内部参照を維持し、ファイル マッピング オブジェクトは、それへのすべての参照が解放されるまで閉じません。したがって、ファイル マッピング オブジェクトを完全に閉じるには、アプリケーションは UnmapViewOfFile を呼び出してファイル マッピング オブジェクトのすべてのマップされたビューのマップを解除し、CloseHandle を呼び出してファイル マッピング オブジェクト ハンドルを閉じる必要があります。これらの関数は、任意の順序で呼び出すことができます。
問題:ファイルのビューを正常にマッピングし、CreateFileMapping によって受け取ったハンドルを閉じた後、FileMap は存在しなくなり (まだ存在するはずです)、MemMapFileReader はエラー 0 で新しいマップを作成できます。エラー 183 「既に存在します」)
悪い解決策:ハンドルを閉じないと MemMapFileReader プログラムからアクセスできますが、プロセスが閉じられるまでハンドルが閉じられないため、MemMapFileCreator でハンドル リークが発生します。
質問:何が欠けているか、または間違っていますか?
MemMapFileCreator
MemMapFileReader
windows - 同期コードが svhost rpcss でハンドルリークを引き起こす可能性があります
win7 x64 システムで一種のプロキシ ソフトウェアを実行していますが、svhost -k rpcss プロセスが深刻なハンドル リークに直面しているようで、数日で 100,000 に達したとしても、ハンドル リークは増え続けています。システムを再起動しないと、PC の動作が遅くなりすぎます。
今、私はこの問題がおそらくプロキシソフトウェアによって引き起こされているのではないかと考えています.windbgを使用してデバッグしようとしていますが、この問題の原因がプロキシソフトウェアであるかどうかを確認する方法はまだわかりません.
誰かが私に言った、悪い同期コードは svhost rpcss プロセスでのハンドルリークにつながる可能性がある、それは本当ですか? 誰かが svhost rpcss でリークを引き起こす可能性のあるコードを教えてもらえますか? はいの場合は、最初に windbg でこのコードを調べてから、そのプロキシ ソフトウェアを注意深く調べることができます。
編集1 @PanagiotisKanavosリークにつながる可能性のあるコードを要求するので、serverfaultではなくこの場所で質問する方がよいでしょう
.net - WCF ReliableSession: フレームワーク 4.5 でリークを処理しますか?
一部のサーバーに 4.5 ランタイムをインストールした後、多くの winsock 関連のエラーが発生しました。.Net 4.5 ランタイムで ReliableSessions を使用して WCF を使用している場合 (4.0 では再現できません)、\Device\Afd へのハンドル リークまで問題を追跡しました。
問題を特定/証明するためのテストプログラムを作成しました。
かなりダミーの WCF サービスとクライアント (VS から生成される可能性がある) を想定します。
そしてそれはホスティングと消費です。
テスト プログラムの出力は次のとおりです。
備考:
- Close() がスローされる可能性があるため、より適切なエラー処理を行う必要があることはわかっていますが、この場合はスローされないため、ここに貼り付けるコードを減らすことを好みました。
- ここでは、(\Device\Afd だけでなく) すべてのハンドルのハンドル数をログに記録します。これにより、すばやくテストしやすくなりますが、sysinternals の handle.exe で多くのチェックを行い、ハンドルの名前/タイプを確認しました。
- ハンドルは、サービスではなくクライアントによってリークされます (少なくとも、サービスホストを閉じた後に適切にクリーンアップされます)。
バリエーション:
- Proxy.Close() を Abort() に変更すると、すべてのハンドルが適切に解放されます (ただし、予想どおり、サービスを閉じるのは困難です)。
- でチャネルを作成して
IClientChannel proxy = ChannelFactory<IMyService>.CreateChannel(binding, address) as IClientChannel
も同じ結果が得られます - channelfactory インスタンスを介してチャネルを作成すると、ハンドルが適切に解放されます。
IClientChannel proxy = new ChannelFactory<IMyService>(binding, address).CreateChannel() as IClientChannel
- ClientBase<>.CacheSetting を AlwaysOn に設定すると、問題は解決しますが、常に可能とは限りません。
このプログラムがハンドルをリークしている理由を誰か知っていますか?
django - django 関数 object.filter を使用すると、python のハンドルが増加しました。これを解決するにはどうすればよいですか?
WIN7 32 System
、 、Django 1.8.13
を使用しPython 2.7
ます。
xxx.object.all()
またはのような関数を使用するxxx.object.filter('xx')
と、python のハンドル番号が増加します。
を使ったようでClass QuerySet
、ハンドル数が増えます。たとえadmin-site
、データベースを管理するために を使用するだけです。ハンドル漏れも発生します。
どうすれば解放または解決できますか?