問題タブ [resource-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.
java - JDK ClassLoader.getResourceAsStream は壊れていますか? (クローズされていないリソース)
ClassLoader.getResourceAsStream()
私はそれが2つを開きInputStreams
、どれも閉じず、1つだけをクライアントに返すことを証明しようとします。私の論理は正しいですか?JDK ソースは jdk1.8.0_25 から選択されます
Spring ClassPathResource を間隔で使用して (元の質問)、プロパティ ファイルにアクセスClassLoader.getResourceAsStream
するために使用している、閉じられていないリソースの問題に遭遇しました。InputStream
調査の結果、それが通り抜けて、そのストリームを開いていることclassLoader.getResourceAsStream
がわかりましたURL
が、すでにそのストリームを開いています。のJDKソース:URL url = getResource(name);
URL url = getResource(name)
ClassLoader
そのように指定するとclose()
、InputStream
によって開かれたストリームのみが閉じられurl.openStream()
ます。JDK ソース:
問題は、JDK がストリームを静かに開き、URL url = getResource(name)
** 2 番目の(クライアントに返される) ストリーム** を作成するためにさらに使用される URL オブジェクトを取得することです。このメソッドのソースを見てください:
そして今、開いたストリームを忘れるgetBootstrapResource(name)
瞬間に!:Resource
URL
Resource
ucp.getResource(name);
リソースを開くのはなぜですか?その method: を見てみましょう。これは次のようにthis.getResource(var1, true);
委譲します:
Resource var5 = var3.getResource(var1, var2);
ストリームを開くのはなぜですか?さらに見てください:
と が閉じられていないことを確認できopenConnection()
、getInputStream()
すべての呼び出しが戻っResource
てきてフォールバックすることがわかります。最終的には、閉じずにgetURL()
ラップされたメソッドのみを使用しています。そのオブジェクトを使用して別のジェットを開き、それをクライアントに返すだけですただし、最初のストリームが閉じられていない状態で終了します)。Resource
InputStream
URL
InputStream
では、ClassLaoder.getResourceAsStream はリソースのリークで壊れていますか?
実用的な側面: 私はブロックで使用getResourceAsStream
してtry-with-resources
いますが、まだ 30 秒ごとにファイル名がロードされている実稼働環境で、クローズされていないリソースの問題があります。close()
さらに、すべてのリソースはガベージ コレクションで閉じられます。これはファイル ストリームインfinalize()
メソッドと一致しています。
c# - アイコンとビットマップの配置に違いはありますか?
アプリケーションのリソース リークをデバッグしていて、GDI オブジェクト リークをテストするテスト アプリを作成しました。OnPaint では、新しいアイコンと新しいビットマップを破棄せずに作成します。その後、ケースごとにタスク マネージャーで GDi オブジェクトの増加を確認します。ただし、アプリのメイン ウィンドウを再描画し続けると、アイコンの GDI オブジェクトの数が増えますが、ビットマップの変更はありません。アイコンがビットマップと同じようにクリーンアップされない特定の理由はありますか?
テスト結果:
- アイコンとビットマップなし - 30 個の GDI オブジェクト
- ビットマップ - 31 GDI オブジェクトでは、数値は変わりません。
- アイコン付き - 31 で、ウィンドウを再描画すると数が増えます。
javascript - オブジェクトの css プロパティを jquery で変更すると、非常にメモリが増加します
Chrome 開発ツールを使用してメモリ リークをテストしましたが、ガベージ コレクターが機能しているため、循環参照はありません。これは非常に奇妙な問題であり、もう何をすべきかわかりません。単純な jQuery 呼び出し$(e).css("top", 'any value other than current');
により、ブラウザは ~5 ~ 200 MB のメモリをタブに割り当てます! 最終的には、約 700 mb で最大に達した後にクラッシュします。これは、さまざまなページでテストしたすべての要素で発生します。ie を試してみると、Chrome のようにメモリ使用量がタスク マネージャーに反映されませんでしたが、最終的にはクラッシュしました。問題が何であるかについて何か考えはありますか?それをさらに分析するにはどうすればよいでしょうか。
java - リソース リーク: 'rset' はこの場所で閉じられていません
だから私はプロジェクトに取り組んでいますが、このエラーに対処する方法や、それを修正するために何ができるかわかりません. 考えられることはすべて試しましたが、他の誰かがそれを修正する方法について意見を持っているかもしれません。これは Java でコーディングされており、ゲーム用です。エラーは「リソース リーク: 'rset' はこの場所で閉じられていません」です。それが選び出すのはこの行です。
誰かがこのエラーを修正する方法について何らかの意見を持っていることを願っています.警告を抑制する必要がありますか?それはメモリリークを引き起こしたり、プログラムのパフォーマンスに影響を与えたりしますか?
java - リソース リーク (リソースは範囲外)
こんにちは、コードの数行です。
現在、次の警告が表示されています。
leaked_resource: 変数がスコープ外に出ると、それが参照するリソースがリークします".
誰か説明してくれませんか?
これは私がそれを修正した方法です:
c++ - dll での GDI リークを防ぐ
dll で使用され、プロセスにロードされるグラフィカル ライブラリがあります。ライブラリ リークが発生しているようです (プロセス エクスプローラーのプロパティ ダイアログの GDI ハンドル数が数回ロード/アンロードされている間、プロセス全体で絶えず増加します)。
dll によって作成されたすべての GDI ハンドルを保存して、dll がアンロードされた後にそれらをすべて削除する方法はありますか? たとえば、CreateBitmap() などをフックしますか? しかし、プロセス自体ではなく、リソースが dll によって作成されているかどうかを判断するにはどうすればよいでしょうか?
よろしく、
java - クラスが閉じられていないときに警告を強制する
java.util.Scanner
や などのIO クラスを使用java.io.BufferedReader
すると、Eclipse に警告が表示されますResource leak: 'suchAndSuch' is never closed
。自分のクラスが閉じられていないときに、Eclipse にこの警告を表示させるにはどうすればよいですか?
私が知りたいのは、クラスが IO クラスのように扱われるようにするために実装する必要があるインターフェイスまたは何かがあるかどうかです。これにより、どの IDE にも依存しなくなります。たとえば、コマンド ラインjavac
は、リソースが「そうでない場合」にも警告を表示します。閉まっています。
shell - shell: 共有 stdout/stderr が原因でハングするリークしたバックグラウンド プロセスをクリーンアップします
テスト実行エンジン用の一時的なコンテナー/VM の (リモート) シェルで、本質的に任意のコマンドを実行する必要があります。場合によっては、これらがバックグラウンド プロセスをリークし、コマンド全体がハングすることがあります。これは、次の単純なコマンドに要約できます。
ここで、backgroundedsleep 30
はリークされたプロセスの役割を果たし (実際には のようなものになりますdbus-daemon
)、echo は実際に実行したいものです。ここsleep 30 & echo payload
では、アトミックな不透明なコマンドの例と見なす必要があります。
上記のコマンドは問題なく、シェルとスリープの stdout/stderr が PTY であるため、すぐに戻ります。ただし、コマンドの出力をパイプ/ファイルにキャプチャすると (テスト ランナーは、結局のところ、すべてをログに保存する必要があります)、コマンド全体がハングします。
現在、これは、stdout/err の FD を から決定し、同じ stdout/stderr を持つすべてのプロセスを/proc/$$/fd/{1,2}
反復して強制終了する、かなりばかげて複雑なシェル マジックで修正できます。ls /proc/[0-9]*/fd/*
しかし、これには多くの壊れやすいシェル コードと高価なシェル文字列の比較が含まれます。
これらのリークされたバックグラウンド プロセスをよりエレガントでシンプルな方法でクリーンアップする方法はありますか? setsid
助けにならない:
リークされたプロセス (dbus-daemon など) はしばしば自身を設定するため、プロセス グループ/セッションを強制終了するだけでは不十分であることに注意してください。
PS私は、これらの環境ではPOSIXシェルまたはbashしか想定できません。Python、Perl などはありません。
前もって感謝します!