問題タブ [fastmm]
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.
delphi - Delphi プログラムのメモリが増え続けるのはなぜですか?
FastMM4 メモリ マネージャーが組み込まれている Delphi 2009 を使用しています。
私のプログラムは、大きなデータセットを読み込んで処理します。データセットをクリアするか、プログラムを終了するたびに、すべてのメモリが正しく解放されます。メモリリークはまったくありません。
spenwarr の回答にある CurrentMemoryUsage ルーチンを使用して、「 Delphi プログラムで使用されるメモリを取得する方法 」で、処理中に FastMM4 で使用されるメモリを表示しました。
発生しているように見えるのは、プロセスとリリースサイクルごとにメモリの使用量が増加していることです。例えば:
データセットなしでプログラムを開始した後、1,456 KB が使用されました。
大規模なデータセットを読み込んだ後、218,455 KB が使用されました。
データセットを完全にクリアした後は 71,994 KB。この時点 (またはこの例の任意の時点) で終了すると、メモリ リークは報告されません。
同じデータセットを再度読み込んだ後、271,905 KB が使用されました。
データセットを完全にクリアした後の 125,443 KB。
同じデータセットを再度読み込んだ後、325,519 KB が使用されました。
データセットを完全にクリアした後の 179,059 KB。
同じデータセットを再度読み込んだ後、378,752 KB が使用されました。
プログラムのメモリ使用量は、ロード/クリア サイクルごとに約 53,400 KB 増加しているようです。タスク マネージャーは、これが実際に起こっていることを確認します。
FastMM4 は、オブジェクトが解放されたときに、プログラムのすべてのメモリをオペレーティング システムに戻すとは限らないため、さらに必要なときにメモリを保持できると聞いたことがあります。しかし、この継続的な成長は私を悩ませます。メモリ リークは報告されていないため、問題を特定できません。
なぜこれが起こっているのか、それが悪いのか、それについて私にできること、またはすべきことがあるかどうか、誰かが知っていますか?
答えてくれたdthorpeとMasonに感謝します。あなたは私が何かを見逃していることに気づかせてくれたものを考えさせ、試しさせました. そのため、詳細なデバッグが必要でした。
結局のところ、終了時にすべての構造が適切に解放されていました。しかし、実行中の各サイクル後のメモリ解放はそうではありませんでした。私の終了クリーンアップが正しくなかった場合、通常は終了時に検出可能なリークを引き起こすメモリブロックが蓄積されていましたが、そうでした。
サイクル間でクリアする必要のあるいくつかの StringLists とその他の構造がありました。以前のサイクルから残っている余分なデータを使用して、プログラムがどのように正しく機能したかはまだわかりませんが、機能しました。私はおそらくそれをさらに研究します。
この質問には回答済みです。ご協力いただきありがとうございます。
delphi - FastMM と動的に読み込まれる DLL
起動時に多数のライブラリをロードするホスト アプリケーションがあります。Delphi 7 のデフォルト メモリ マネージャから FastMM4 のフル バージョンに切り替えて、メモリ リーク レポートを改善したいと考えています。
ホスト アプリケーションとライブラリの両方の uses セクションに FastMM4 を含める必要がありますか? 共有ランタイム パッケージはどうですか?
いくつかの追加情報:
- 1 つの exe と 20 以上の dll があります。全員が 1 つのランタイム パッケージを共有しています。
- 現在、sharemem は使用していません。私が知っていることではありません。ShareMem は、今日簡単に調べた exe または dll の 8 分の 1 には含まれていません。
追加の質問:
- すべてのプロジェクトで fastmems inc ファイル内で同じオプションを使用できますか、それとも exe と dll で異なる設定が必要ですか?
delphi - 他のプログラミング言語と互換性のある Delphi DLL
文字列を返す関数をエクスポートする DLL を構築したいと考えています。この DLL は、他のプログラミング言語で動作するはずです!! これに対するあらゆる種類の厄介な解決策/ハックを見つけました。最善の方法は、関数が Pchar を返してから、同じ DLL に含まれる別の関数を呼び出して (ReleaseMemory と呼びましょう)、PChar 用に予約されたメモリを解放することです。
とにかく、最近 FastShareMem ライブラリを発見しました。ReleaseMemoryを呼び出さずに、私が望むことを正確に実行できると言われています。一方、FastMM は、DLL とアプリケーションの両方がメモリ マネージャーとして FastMM を使用するため、同じ AS LONG を実行しているようです。これにより、FastMM をユニバーサル DLL のメモリ マネージャーとして使用する機会が即座に失われます。右?
====================
FastShareMem ( http://www.codexterity.com/fastsharemem.htm )、Delphi 7、Windows XP 32 ビット、Windows 7 64 ビット
delphi - Windows XP Embedded で実行している Delphi 2006 アプリでメモリ エラーが発生するのはなぜですか
FastMM4 を使用する D2006 アプリがあります (たとえば、DPR ファイルの uses 句の先頭に「FastMM4」が含まれています)。とにかく、Delphi がメモリ マネージャーとして FastMM4 を使用していることは知っていますが、ダウンロードしたバージョンには、より多くのデバッグ ダンプ オプションがあります。
最近、Windows XP が組み込まれたシングルボード タブレット タイプの産業用 PC でアプリを実行しようとしました。プロセッサーは非インテル「Vortex」チップです。アプリは起動時にメモリ エラーで失敗し、メモリが解放された後にメモリへのアクセスに関する FastMM4 からの苦情で終了します。
ソース コードから FastMM4 の痕跡をすべて削除すると、問題が解決するようです。アプリは問題なく動作します。
私の質問。この問題を引き起こす FastMM4 のダウンロード バージョンについては何ですか? ASM コードの使用に関連していると思われる FastMM4 および Intel 以外のプロセッサでのクラッシュに関する逸話を見てきました。FastMM4 には、非 ASM コードの生成を強制するディレクティブが含まれていますが、それでは問題は解決しません。
FastMM4 の統合された D2006 バージョンにまだ問題が存在する可能性があることを少し心配していますが、まだ確認していません。
delphi - Delphi自動ガベージコレクタ
将来、Delphiに自動ガベージコレクターを導入することを考えることはできますか?オブジェクトを解放するタイミングを詳細に制御することはそれほど重要ではなく、気にする必要があるだけのアプリケーションがたくさんあります。
Javaのように機能する一種のガベージコレクターを持つそのようなアプリケーションにとっては興味深いでしょう。
プロジェクトオプションで設定できます。
これは可能かどうか?
注:ここで説明するように手動で作成するつもりはありません。実際にはDelphiの機能を意味します。
別の言い方をすれば、FastMMをガベージコレクターとして機能するように設定することは可能ですか?
delphi - FastMM に FullDebugMode を使用すると、IDE での実行に失敗する
FullDebugMode
(fastmm4) を使用して、メモリ リークの詳細なレポートを取得しようとしています。
作成して解放しないダミーアプリケーションでこの作業を成功させることがTStringList
できますが、別のアプリケーションではできません。
両方のプロジェクトで、dpr は次のようになります。
そしてFullDebugMode
、Fasttmm inc オプション ファイルで有効にしました。
両方のプロジェクトのプロジェクト オプションで、次の設定を True に設定しました。
コンパイルタブで:
**ランタイム型情報を発行する
debug dcus** を使用
リンク設定タブで:
デバッグ情報
これらの設定はダミーアプリでは問題なく機能しますが、リンク直後の実際のアプリでは、IDE イベントログウィンドウが表示され、その後
モジュール ロード: SHLWAPI.dll。デバッグ情報はありません。ベースアドレスなど...
すぐにプログラムがリセットされます (CTRL-F2 を実行した場合のように)
あなたはなにか考えはありますか?
delphi - Delphi: FastMM は実行可能ファイルを大きくしますか?
FastMM は実行可能ファイルを大きくしますか? アプリが約 300 ~ 500kb 大きくなることに気付きました。これは私にとってかなり大きいです。デバッグ情報を除外するために Delphi コンパイラ オプションをオフにしましたが、サイズは変わりません。
FastMM の FullDebugMode を on に使用していますが、これはサイズに影響しますか? しかし、オフにしようとすると、libc が検索されますが、見つかりませんでした。
助けてください...私はD5を使用しています
delphi - Delphi 6 パッケージで FastMM4 を使用するには?
Delphi 6 Pro アプリケーションで FastMM4 バージョン 4.92 をスムーズに使用しています。私が作成したパッケージ (BPL) で使用したいと考えています。ユニットを [Contains] セクションに配置してからリストの一番上に移動しようとしましたが、FastMM4 から初期化する最初のユニットではないというエラーが表示されます。これを修正するために、FastMM4 を Requires セクションに入れたいのですが、FastMM4 の DCP ファイルがどこにも見つかりません (ランタイム ライブラリ)。これを実現する方法を知っている人はいますか?
delphi - このコードで TOleStream を解放する方法
これは、私が Web ブラウザ コンポーネントにファイルをロードするために使用する Delphi で行われたカスタム ネームスペース ハンドラからのものです。
問題は、Fastmm4 がプログラムの終了時にメモリ リーク エラーを出し、TOleStream が解放されていないことを示すことです。どうすれば解放できますか? TOleStream を変数に入れて、このように割り当てると
最後に、TOS 変数を解放すると、エラー (ComObj 内の TComObject.ObjRelease を指す EAccessViolation) が発生します。コメントとヘルプをいただければ幸いです。この問題は、しばらくの間私を悩ませてきました。
また、FastMM4で何かできるのだろうかと思っていますか? 虚偽の情報を提供している可能性はありますか?次のようなコードで。通常、TOLEStream はどのように解放されますか?
また、TFileStream を使用せずにデータをデータストリームに送信する方法はありますか?
Remy さん、こちらで fastmm と問題の手順を使用した名前空間ハンドラーの動作デモ プロジェクトを見つけることができます: http://mode5.webs.com/namespace.7z プロジェクトが読み込まれたら、ボタンをクリックして名前空間ハンドラーを読み込みます。ファイル。終了すると、fastmm エラーが発生するはずです。敬具、
delphi - 未使用のメモリを解放するようにメモリマネージャを説得する方法
最近の投稿で(私のプログラムはメモリを解放しません。なぜですか?)FastMMを使用すると、アプリケーションがシステムに大量のメモリを解放しないことを示します。最近、私は人工的なテストプログラムを作成して、問題がメモリではなく、FastMMでのみ表示されることを確認しました。
このプログラムでは、オブジェクト(前の投稿で使用したものと同じ)を500回作成および破棄します。
メモリ要件は次のとおりです(「プライベートワーキングセット」):
FastMMなし
ループを実行する前:1.2MBループ
を実行した後 :2.1MB
FastMM(アグレッシブデバッグモード)を使用
する場合ループを実行する前:2.1MBループ
を実行した後:25MB
FastMM(リリースモード)
の場合ループを実行する前:1.8MBループ
を実行した後:3MB
ループを数回実行しても、メモリ要件は増加しません。これは、解放されていないメモリが再利用されるため、これがメモリリークではないことを意味します(メモリリークは、実行ごとに数KB / MBのメモリフットプリントを増加させます)。
私の質問は次のとおりです。
FastMMでこの動作を無効にするにはどうすればよいですか?それも可能ですか?FastMMなしまたはFastMMリリースモードを使用してプログラムをリリースすると、適度な量のRAMが「浪費」されることはわかっています。ただし、この動作をオンデマンドで無効にすると、メモリリークを特定するのに役立ちます(私たち?)。実際、私の最初の投稿(リンクを参照)では、多くの人が私にリークがあると示唆しました。混乱は明らかにこの振る舞いのために作成されました。いいえ、漏れがないことは明らかです。大量のメモリを解放することを拒否するのは、メモリマネージャだけです。
余分なメモリを解放しますか?いつ?これを引き起こすものは何ですか?プログラマーはそれをトリガーできますか?たとえば、RAMを大量に消費するタスクを完了し、ユーザーがプログラムをしばらく使用できない(最小化する)可能性があることがわかっている場合、RAMをシステムにフラッシュして戻すことはできますか?ユーザーが私のプログラムの複数のインスタンスを開くとどうなりますか?彼らはRAMをめぐって競争しませんか?