問題タブ [memory-leaks]
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++ - (アンマネージ) コードのメモリ リークをどのように検出/回避しますか?
アンマネージ C/C++ コードで、メモリ リークを検出するためのベスト プラクティスは何ですか? 避けるべきコーディングガイドラインは?(あたかもそれがとても単純であるかのように;)
過去に少しばかげた方法を使用しました: メモリ割り当て呼び出しごとにカウンターをインクリメントし、解放中にデクリメントします。プログラムの最後に、カウンター値はゼロになるはずです。
私はこれが素晴らしい方法ではなく、いくつかの問題があることを知っています. (たとえば、プラットフォーム API 呼び出しによって割り当てられたメモリを解放する場合、割り当てカウントは解放カウントと正確には一致しません。もちろん、メモリを割り当てた API 呼び出しを呼び出すときにカウンターをインクリメントしました。)
あなたの経験、提案、そしておそらくこれを簡素化するツールへの参照を期待しています。
c - Cのメモリリーク検出器?
人々が良い経験をしたメモリリーク検出器は何ですか?
これまでの回答をまとめると次のようになります。
Valgrind - 動的分析ツールを構築するための計測フレームワーク.
Electric Fence - GDB で動作するツール
Splint - アノテーション支援の軽量静的チェック
Glow Code - これは、C++、C#、または任意の .NET Framework でアプリケーションを開発する Windows および .NET プログラマー向けの完全なリアルタイム パフォーマンスおよびメモリ プロファイラーです。
このスタックオーバーフローの投稿も参照してください。
c++ - スマート ポインターが原因のメモリ リークを見つける
スマートポインタによって引き起こされるメモリリークを発見する「テクニック」を知っている人はいますか? 私は現在、C++で書かれた大規模なプロジェクトに取り組んでおり、参照カウントを伴うスマート ポインターを多用しています。明らかに、コードのどこかでまだ参照されているスマート ポインターによって引き起こされるメモリ リークがいくつかあるため、それらのメモリは解放されません。「不必要な」参照を含むコード行を見つけるのは非常に困難です。これにより、対応するオブジェクトが解放されなくなります (ただし、それはもはや役に立ちません)。
Web で、参照カウンターのインクリメント/デクリメント操作のコール スタックを収集することを提案するアドバイスを見つけました。これにより、どのコードが参照カウンターの増加または減少を引き起こしたのか、良いヒントが得られます。
しかし、私が必要としているのは、対応する「呼び出しスタックの増加/減少」をグループ化するある種のアルゴリズムです。これらのコール スタックのペアを削除した後、(少なくとも) 1 つの「コール スタックの増加」が残っていることを願っています。これで、リークを修正することは大したことではなくなります。
しかし、グループ化を行う「アルゴリズム」のアイデアはありますか?
開発はWindows XPで行われます。
(私が説明しようとしたことを誰かが理解してくれることを願っています...)
編集: 循環参照によるリークについて話しています。
file-io - fdopen() がメモリ リークを引き起こす可能性はありますか?
fdopen を使用して、ストリームを開いているファイルに関連付けます。
ファイルをclose()
開くと、ストリームも自動的に関連付けが解除され、すべてのストリーム メモリが OS に返されますか?それとも、fdopen されたファイルを認識して特定の方法で閉じる必要がありますか?
-アダム
c++ - この C++ コードはメモリ リークを引き起こしますか (配列の新規キャスト)
私は可変長構造 (TAPI) を使用するいくつかのレガシー C++ コードに取り組んできました。構造のサイズは可変長文字列に依存します。構造体は、次のように配列をキャストすることによって割り当てられnew
ます。
ただし、後でdelete
呼び出しを使用してメモリを解放します。
new[]
この配列と非配列の混合はdelete
メモリリークを引き起こしますか、それともコンパイラに依存しますか? 代わりにmalloc
このコードを使用するように変更した方がよいでしょうか?free
python - Guile拡張モジュールでメモリリークをチェックする方法は?
私は C で書かれた Guile の拡張モジュールを開発しています。この拡張モジュールには Python インタープリターが組み込まれています。
この拡張モジュールは Python インタープリターを呼び出すため、Python オブジェクトが占有するメモリが適切に管理されていることを確認する必要があります。
私は、Python インタープリターが独自のメモリ処理で適切に動作していることを発見しました。そのため、valgrind を実行することで、他に干渉要因がなければ、独自の Python インタープリター埋め込みコードのバグによるメモリ リークを見つけることができます。
しかし、valgrind の下で Guile を実行すると、valgrind がメモリ リークを報告します。このようなメモリ リークは、自分のコードによるメモリ リークを覆い隠します。
問題は、私のコードのバグによるメモリ リークを、valgrind によって報告された Guile によるメモリ リークと区別するにはどうすればよいかということです。valgrind の代わりに別のツールはありますか? 特別な valgrind オプション? あきらめて、手動のコード ウォークスルーに頼りますか?
exception - 「java.lang.OutOfMemoryError: PermGen space」エラーの処理
最近、Web アプリケーションで次のエラーに遭遇しました。
java.lang.OutOfMemoryError: PermGen スペース
これは、Tomcat 6 および JDK 1.6 で実行される典型的な Hibernate/JPA + IceFaces/JSF アプリケーションです。どうやらこれは、アプリケーションを数回再デプロイした後に発生する可能性があります。
何が原因で、それを避けるために何ができるでしょうか? 問題を解決するにはどうすればよいですか?
java - JVM がメモリをリークすることなく、Nokia の電話 (N80/N95) で Java Midlet を使用してオーディオを録音できますか?
Java Midlet を搭載した Nokia 携帯電話でオーディオのスニペットを繰り返しキャプチャしたいと考えています。私の現在の経験では、Sun のドキュメント ( http://java.sun.com/javame/reference/apis/jsr135/javax/microedition/media/control/RecordControl.htmlを参照) のコードを使用し、これを " while(true)" ループは機能しますが、アプリケーションは電話のすべてのメモリをゆっくりと消費し、プログラムは最終的に例外をスローして、それ以上の録音を開始できません。
消費されるメモリは Java ヒープ メモリではありません---私のサンプル プログラム (下記) は、Java メモリが約 185,000 バイトでほぼ静的であることを示しています--- しかし、Nokia が提供する基盤となるサポート ライブラリに何らかのメモリ リークがあります。Java アプリケーションをしばらく実行した後に別の (Java 以外の) アプリケーション (Web ブラウザなど) を起動しようとすると、メモリ不足の警告が表示されて電話がそのアプリケーションを強制終了するため、メモリ リークが発生すると考えられます。
ドキュメントの Sun の標準的な例で採用されているものとは異なるいくつかのアプローチを試しました (ループのたびにすべてを初期化し、できるだけ多くの初期化を 1 回だけ行い、厳密には必要ではないはずの割り当て解除スタイルの関数をできるだけ多く呼び出します)。等。)。どれも成功していないようです。以下は、N80 (ファームウェアの更新にもかかわらず) と N95 の両方で 15 分ほど実行した後にクラッシュするはずの簡単なサンプル プログラムです。他のフォーラムでもこの問題が報告されていますが、そこで提示された解決策は機能していないようです (たとえば、http: //discussion.forum.nokia.com/forum/showthread.php ?t=129876 を参照)。
java - Threadオブジェクトでrun()を呼び出すと、Javaプログラムがメモリリークを起こすのはなぜですか?
(ジェパディスタイルの質問、この問題が発生したときに回答がオンラインであったらいいのにと思います)
Java 1.4を使用して、あるときはスレッドとして実行したいが、他のときは実行したくないメソッドがあります。そこで、それをThreadのサブクラスとして宣言し、必要に応じてstart()またはrun()を呼び出しました。
しかし、私のプログラムは時間の経過とともにメモリをリークすることがわかりました。私は何が間違っているのですか?
java - Java プログラムによって引き起こされた C メモリのリークをどのように診断しますか?
Sun 1.6 JVM (1.6_05) でメモリ リークを引き起こしている大規模なアプリケーション (300K LOC) に取り組んでいます。Java のプロファイリングでは、リークは見られません。リークの原因を検出できる JVM からの診断はありますか?
単純で分離された Java テスト ケースを作成できませんでした。JVM で C ヒープ アナライザーを使用してこれを把握する唯一の方法はありますか?
アプリケーションはソケットのプールを作成し、大量のネットワーク I/O を実行します。