私のプログラムはメモリを返すことはありません。どうして? -- delphi フィールド 関連 問題

My program never releases the memory back. Why?












3
vote

問題

日本語

MDIプログラムを持っています。開始すると2~3MBのRAMが必要です。その後、このプログラムでは、約260 MDIの子ウィンドウを作成します(それぞれがTStringGrid、Bitmap、およびその他のコントロールを持っています)、データを表示します。アプリケーションはすべてのウィンドウをロードするために約500MBが必要です。各MDI子を手動で閉じると、アプリケーションはまだ160MBのRAMを使用します。なぜそれが数MBのRAMに戻らないのはなぜですか?私はこれを心配すべきですか? 160MBそれは1GBまたはRAMのみを持つシステムのための多くです!!

注:Task Managerの[作業セット]列を使用してRAMの統計を確認します。たぶん私はRAMの利用を読むためのより良いツールが必要です。 (プライベートワーキングセットはワーキングセットより少し小さいです)。

これは漏れではありません!
FASTMM(AGGRESSIVEに設定)プログラムを閉じると、メモリリークがないことを示します。それが漏れではないというさらなる証拠についての私の回答投稿を参照してください。

私はものをリリースします
多くの人が子供の窓を閉じることだけがそれを隠すだけだと私に言った。そんなこと知ってる。実際にフォームを解放するには、「Action:= Cafree」を使用します。各フォームはそれが保持するコントロールを解放する責任があります。

答え FASTMMがこれに責任があることを発見しました。私が下記に投稿した答えを見てください。


Delphi 7、Win 7 32ビット
同様の投稿:
クリーニングできますか?
SetProcessWorkingSetsizeを呼び出すとき(メモリマネージャをメモリを解放するように説得力のある)

英語

I have a MDI program. When It starts it takes 2-3MB of RAM. Then, in this program I create about 260 MDI child windows (each has a TStringGrid, a bitmap and some other controls) and display some data. The application needs about 500MB to load all those windows. If I close each MDI child manually, the application still uses 160MB of RAM. Why it doesn't return to few MB of RAM? Should I worry about this? 160MB it is A LOT for a system that has only 1GB or RAM!!

Note: I use the WORKING SET column in Task Manager to see RAM statistics. Maybe I need a better tool to read the RAM utilization. (Private Working Set is just a bit smaller than Working Set).

This is not a leak!
FastMM (set on aggressive) indicates no memory leak when I close the program. See my Answer post for additional evidence that it isn't a leak.

I release stuff
Many people told me that closing a child window only hides it. I know that. I use "Action:= caFree" to actually release the forms. Each form is responsible for releasing the controls it holds.

Answer
I have found that FastMM is responsible for this. See the answer I posted below.


Delphi 7, Win 7 32 bit
Similar posts:
Can memory be cleaned up?
When to call SetProcessWorkingSetSize? (Convincing the memory manager to release the memory)

</div
  
         
         

回答リスト

7
 
vote

タスクマネージャは、メモリリークを検出するための適切なツールではありません。 Delphiはメモリの大きなブロックを割り当て、将来の使用のために後でそれらを保持しますので、すべてのリソースを解放した後でも割り当てられたメモリの一定の増加が期待されます。他の結果(およびより詳細な回答)は、特殊なメモリ解析ツールを使用することによってのみ取得できます。 AQTIMEは最初のものですが、頭を念頭に置いていますが、または古いが便利なミニックを見つけることができれば、それはあなたがたくさん役立ちます(Memproofは無料で、メモリ分析はAQTimeよりも便利です)。

 

Task Manager is not the right tool to detect memory leaks. Delphi allocates large blocks of memory and keeps them later for future use, so certain increase in allocated memory is expected even after you release all resources. Any other results (and more detailed answers) can be obtained only by using specialize memory analysis tools. AQTime is the first that comes to mind, or if you can find old but useful MemProof, it would help you a lot (MemProof is free and for memory analysis it's more handy than AQTime).

</div
 
 
     
     
4
 
vote

FASTMMがアプリケーション終了時にメモリリークを表示しないことは非常にうまくいきます(たとえば、すべてのオブジェクトが所有されているTcomponents、および所有者がそれらを解放されます)。
しかし、その間に、それらのコンポーネントを実行しながらまだ十分に解放されないことがあります。

現在のメモリ使用量を持つ形式を示すFASTMMユニットを使用しましたか?

<>編集&gt;
これは、ディレクトリ<コード> ...FastMMDemosUsage Tracker の FastMMUsageTracker.pas です。
そのユニットを使用してから、<コード> ShowFastMMUsageTracker FastMMUsageTrackerProject サンプルオンラインを入れました。 FASTMM4の更新メモリリークの確認とデバッグを容易にする:

  • FastMMUsageTracker ユニットの形式はサイズ変更可能で、右側の方法でのコントロール
  • 新しい<コード> FastMmBootstrapUnit ユニットは、デバッグ特定のメモリリークを漏らしています

先週手元に持っていたものは、Delphiで書かれていなかった第三者のDLLでした。
DLLは、FastMMによって追跡されていないWindows GlobalAlloc呼び出しを使用してメモリリークがありました。

NB:

のfastmmにアップデートを投稿しようとしています

- jeroen

 

It is very well possible that FastMM does not show memory leaks upon application termination (for instance because all objects are TComponents that are owned, and the ownser frees them).
But in the mean time, while running those components can still be around, and not freed soon enough.

Did you use the FastMM unit that shows a form with the current memory usage?

< Edit >
This is the FastMMUsageTracker.pas in the directory ...FastMMDemosUsage Tracker.
Use that unit, then call the ShowFastMMUsageTracker function in it. You can refresh that form every once in a while to see how your memory consumption grows. I have put a FastMMUsageTrackerProject sample on-line, including an update of FastMM4 that makes it easier to check and debug memory leaks:

  • the form in the FastMMUsageTracker unit is now resizable, and the controls in it anchor in the right way
  • there is a new FastMmBootstrapUnit unit making debugging specific memory leaks easier

Something I had at hand last week, was a 3rd party DLL, which was not written in Delphi.
The DLL had a memory leak using Windows GlobalAlloc calls, which are not tracked by FastMM.

NB: I'm about to post an update to FastMM on

--jeroen

</div
 
 
     
     
4
 
vote
vote
ベストアンサー
 

回答:

私のプロジェクトからFastMMを削除し、プログラムはそれらのすべての子ウィンドウを解放した後に数MBに戻りました。多くの人が誤っていることではなく、Fastmmが何らかの種類の変態メモリ最適化を行うためにこれを行っていると主張することがあります。それらは真実かもしれません。しかし、それは私のアプリケーションにとって良いかもしれませんが、それは他の実行中のアプリケーションには良くないかもしれません。

だから、少なくとも誰がこれを引き起こすかを知っています。私はプログラムが古いバケツのようにラムを漏らしているかもしれない一日を心配しています。私は今安心しています。

更新:

この動作がfastmmによって生成されることを確認するために(Barry Kellyによって示唆されたように)私は多くのRAMを割り当てた2番目のプログラムを作成しました。 WindowsがRAMから実行されるとすぐに、プログラムメモリ使用率は元の値に戻りました。
(注:fastmmにバグがあると言っていません!)

私のプログラムは漏れていません。問題解決しました。

 

Answer:

I just removed FastMM from my project and the program returned to few MB after freeing all those child windows. Many may argue that this is not a misbehavior and that FastMM is doing this in order to do some kind of kinky memory optimizations. They may be true. However, it may be good for MY application but it may not be good of other running applications.

So, at least we know who causes this. I worried to a whole day that may program is leaking RAM like an old bucket. I am relieved now.

UPDATE:

To confirm that this behavior is generated by FastMM (as suggested by Barry Kelly) I created a second program that allocated A LOT of RAM. As soon as Windows ran out of RAM, my program memory utilization returned to its original value.
(Note: I am not saying there is a bug in FastMM!)

My program is not leaking. Problem solved.

</div
 
 
0
 
vote

FASTMMのメモリリークトレースの主な制限は、プログラムをシャットダウンしたときにのみ実行できることです。プログラムをシャットダウンしたときにクリーンアップされたオブジェクトまたはその他のデータへの参照を保持していることがまだある可能性があります。

たとえば、MDI子ウィンドウを閉じるときは、無料またはそれらをリリースしますか、それともそれらを消すだけですか?彼らが隠されていて解放されていない場合、彼らはまだメモリに入っています。

 

The main limitation of FastMM's memory leak tracing is that it can only run when you shut down the program. It could be that you're still holding references to objects or other data that gets cleaned up when you shut down the program, but stays around until then.

For example, when you close the MDI child windows, do you call Free or Release on them, or just make them disappear? If they're hidden but not freed, they'll still be in memory.

</div
 
 
         
         
0
 
vote

MDIフォームを閉じると自動的に解放されません。フォームが解放されていることを確認するには、Action = Cafree(Google)を使用してください。

 

If you close an MDI form it is not freed automatically. Use Action = caFree (google for that) to make sure the form is also freed.

</div
 
 
 
 

関連する質問

3  Delphiのスピンコントロール[閉じた]  ( Spin control in delphi ) 
この質問はスタックオーバーフローガイドラインを満たしていません。現在答えを受け付けていません。 この質問を改善したいですか? ...

2  DBASE4テーブルを開いて書き込む必要があります。どのDelphiルートをお願いしますか?  ( Need to open and write a dbase4 table which delphi route please ) 
Delphi(7と2009/10)を使ってdbase4テーブルを開いて追加する必要があります。現在のところホームロールコードを使用して行われます。私はこのタスクがDelphiで簡単であると思いますが、どのリンクメカニズムを使うべきですか?私はBDEが古くて現...

4  MDIフォームをモジュールとして表示します  ( Showing mdi form as modal ) 
これはMDIの性質に反して音を鳴らします。MDIフォーム(FormStyle = FSMDICHILD)をモーダルとして表示する必要があります。そして、私はまた、Application.CreateFormとOnShowイベントの間の部分にアクセスする必要があ...

10  DelphiでAsyncソケットプログラミングを行う慣用の方法は何ですか?  ( Whats the idiomatic way to do async socket programming in delphi ) 
Delphiでネットワークコードを書く通常の方法は何ですかWindowsスタイルの重複非同期ソケット入出力? これはこの質問についての私の事前の研究です: Indy コンポーネントは完全に同期しています。一方、SCKTCompユニットはWSAASYNCS...

4  Delphi Win API CreateTimerQueuetimerスレッドとスレッドセーフフォーマットDateTimeクラッシュ  ( Delphi win api createtimerqueuetimer threads and thread safe formatdatetime cras ) 
これは長い質問ですが、ここで行く。 を使用するという点でスレッドセーフであると言われるFormatDateTimeのバージョンがあります。 <事前> <コード> GetLocaleFormatSettings(3081, FormatSettings); ...

2  Delphi 2009への移行 - 無効なタイプキャストエラー  ( Migrate to delphi 2009 invalid typecast error ) 
graphicexプロジェクトをDelphi 2009に変換しています。 scanf_c.pas 。これが問題です: <事前> <コード> With TscRec(FType) do begin ftypeは整数で、TSCRECが定義されていま...

31  Windows DLLはそれ自身のファイル名を取得できますか?  ( Can a windows dll retrieve its own filename ) 
Windows EXEファイルには、そのパスとファイル名を含め、呼び出されたコマンド文字列にアクセスできます。例えば。 <コード> C:MyAppMyApp.exe --help 。 しかしこれは、 LoadLibrary を介して呼び出されたDLLの場合は...

49  Delphiプログラムが使用するメモリを取得する方法  ( How to get the memory used by a delphi program ) 
globalMemoryStatusexを使用してシステムメモリを使用する方法を知っていますが、OS全体が使用しているものを教えてください。 私は本当に私のプログラムがそれがどのくらいのメモリを割り当てて使用しているかを報告したいです。 私のプログラムだけ...

1  Delphi 5:「時代遅れ」または「廃止予定」メソッドをシミュレートするためのアイデア?  ( Delphi 5 ideas for simulating obsolete or deprecated methods ) 
私は廃止された方法をマークしたいが、Delphi 5はそのような特徴を持っていない。 例のために、これは推奨されていない新しい優先形式を含むメイドの方法です: <事前> <コード> procedure TStormPeaksQuest.BlowHodirsHo...

6  アプリケーションの自動更新ユーティリティは、ウイルス対策をトリガーしています  ( My applications auto update utility is triggering anti virus ) 
100ユーザーに配布されている自動更新アプリケーションを作成しました。 auto-updateユーティリティはViruStotalの55%のアンチウイルスでフラグが立てられています( Link ) 私の申請はDelphi 7で作成されました。ほとんどのフラ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有