問題タブ [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# - System.Threading.Timer から UI を呼び出すときにハンドルのリークを回避するにはどうすればよいですか?
System.Threading.Timer からのコールバックで winforms コントロールで Invoke を呼び出すと、タイマーが破棄されるまでハンドルがリークするようです。これを回避する方法を知っている人はいますか? 毎秒値をポーリングし、それに応じて UI を更新する必要があります。
テストプロジェクトで試してみて、それが実際にリークの原因であることを確認しました。これは単に次のとおりです。
Windows タスク マネージャーで監視すると、1 秒あたり 2 ハンドルがリークします。
.net - .NETSystem.Threading.Threadクラスでリークを処理する
アプリのハンドルの数が増え続けているという問題があります。私はデバッグを行い、これがいくつかのルーチンに使用されるSystem.Threading.Threadクラスによって引き起こされていることを認識しました。デバッグを簡素化するために、サンプルの.NETアプリケーションを作成しました。
ボタンをクリックするたびに、System.Threading.Threadクラスを使用してスレッドが作成されます。問題は、クリックするたびにハンドルの数が最大5増加するため、スレッドがハンドルを解放しないように見えることです。
問題は、System.Threading.Threadクラスによって作成されたすべてのハンドルを手動で解放するにはどうすればよいですか?
前もって感謝します。
c# - 奇妙なハンドルリーク
私のアプリケーション(ベースアプリケーションはC ++ / CLIとのMFC相互運用ですが、多くのC#、Windowsフォーム、WPFも含まれています)にハンドルリークがあります。アプリケーションの開始直後に、タスクマネージャーのハンドル数が継続的に増加していることがわかります(1秒あたり10個の新しいハンドルの割合で)。そこで、handles.exeを使用して、ハンドルの種類を確認しました。リークしているハンドルがプロセスハンドルであることがわかりました。そして、それらは私のアプリケーションのプロセスへのプロセスハンドルです。
それで、私は通常、どの操作がそれが実行されるプロセスへのハンドルを作成するのだろうかと思います。何か考えはありますか?このようなものを見たことがありますか?デバッグDLLを使用できず、xcopyでデプロイできるツールしか使用できないことを考慮して、リークを追跡するために他に何ができるでしょうか。
アップデート:
windbgと!handle、!htraceをスローすることができ、プロセスハンドルはすべて、次のスタックトレース(頻度順に)を使用して作成されていることがわかりました。
また
また
さて、それは私に何を伝えますか?
windbg - !htraceはコールスタックを表示しません
WinDbgで!htrace -diffを使用してハンドルリークをデバッグすると、コールスタックを表示しない多くのハンドル(おそらくリークしているハンドル)が表示されます。
これの理由は何であり、これをさらにデバッグするためにどのようなオプションが必要ですか?
更新:ハンドルリークは、グラフィックドライバまたはグラフィックカードに依存しているようです。何らかの形式のWPFを使用すると、リークが発生し始めます。これは、特定のグラフィックカード/ドライバーを搭載した一部のWindowsXPシステムでのみリークします。
c# - AdsConnectionが閉じられていませんか?
次のコードを検討してください。
すべての顧客がAdavatageDBサーバーを持っているわけではなく、OleDbConnectionにフォールバックする必要があるため、この方法は一般的です。ただし、ほとんどの場合、AdsConnectionオブジェクト(Advantage.Data.Provider.dllから)を使用します。
上記のコードは接続を閉じ、usingステートメントを終了するとオブジェクトが破棄されます。
Advantage Management Utilityを使用してAdsサーバー上のすべての接続を表示すると、接続が開いたままになっていることがわかります。すべてではありません!メソッドをおそらく200回呼び出しますが、開いたままになるのはごくわずかで、クライアントのMAX_CONNECTIONSを超えることもあります。JensMühlenhoffのおかげで、それを回避することができます。
質問は:
oConn.Close()を呼び出すときに接続が閉じないのはなぜですか?誰かアイデアはありますか?
c# - WinDbgでC#スタックトレースを表示する際の問題
C#プログラムでハンドルリークが発生しました。おおまかにこの回答に示されているように、!htraceを使用してWinDbgを使用して診断しようとしていますが、WinDbgで!htrace -diffを実行すると、C#関数の名前が表示されないスタックトレースが表示されます(または私の.netアセンブリでさえ)。
私は自分の難しさを説明するために小さなテストプログラムを作成しました。このプログラムは、「リーク」ハンドル以外は何もしません。
アセンブリをコンパイルしてから、WinDbgで[ファイル]-> [実行可能ファイルを開く]に移動し、プログラム(D:\ Projects \ Sandpit \ bin \ Debug \ Sandpit.exe)を選択します。プログラムの実行を続行して中断し、「!htrace -enable」を実行してから、もう少し長く続けてから、中断して「!htrace-diff」を実行します。これは私が得るものです:
ご覧のとおり、スタックトレースには、C#関数名「Main」と「Fun1」がありません。「System_ni+0x ...」フレームが私の関数フレームかもしれないと思いますが、わかりません。私の質問は、WinDbgでC#関数の関数名をスタックトレースに表示するにはどうすればよいですか?
追加情報:私のWinDbgシンボル検索パスは
SRV C:/ symbol http://msdl.microsoft.com/download/symbols ; D: \ Projects \ Sandpit \ bin \ Debug; srv *
WinDbgで実行可能ファイルを開いても、エラーは発生しません。出力ディレクトリ(「D:\ Projects \ Sandpit \ bin \ Debug」)に「Sandpit.pdb」というファイルがあります。プロジェクトはローカルでビルドされるため、pdbファイルはexeと一致する必要があります。ここからWinDbgをダウンロードしました。VisualStudioのプロジェクト設定で[ネイティブコードのデバッグを有効にする]をオンにしました。
c# - .Net 2.0 Windows アプリケーションでのリークの処理
アプリケーションでリークを処理する必要があります。
アプリケーションでいくつかのビューアをテストして、約 200 回の開閉を行ったところ、ハンドル数が約 200 であることがわかりました。
同じビューアの場合、メモリ使用量は一定であり、GDI カウントも一定です。
問題は、ハンドルが毎回増加していることですが、一定ではありません。5 ずつ増加する場合もあれば、1 ずつ増加する場合もあれば、減少する場合もあります。GDI リークのように一定の増加は見られませんでした。
アプリケーションに登録されているすべてのイベントのサブスクライブを既に解除し、アプリケーションで使用されているすべてのコントロールも破棄しました。以前は、アプリケーションにもメモリ リークがありました。すべてのコントロールを破棄した後も、一定のままです。
では、この場合に確認する必要がある他のすべてのことは何ですか。メモリ/GDI カウントは一定ですが、ハンドルは増加するだけなので、少し混乱します。
任意の提案をいただければ幸いです。
c# - C# アプリでハンドル リークを検出する方法
私のC#アプリでは、実行すると、ハンドル列の数が着実に増加していることがWindowsタスクマネージャーではっきりとわかります。メモリは問題なく増加しません。ハンドルだけが非常に高いレベルに到達します。
このリークをデバッグして検出し、ハンドル リークを解決するにはどうすればよいですか。
ありがとう!
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]} に変わります。