5

私たちのアプリケーションは、特定のユーザーのコンピューターで失敗していますERROR_NOT_ENOUGH_MEMORY(「このコマンドを処理するのに十分なストレージがありません」)。

エラーは、使用しているDelphi VCLフレームワークのどこかで発生しているようです。そのため、どのWindowsAPI関数が原因であるかわかりません。

メモリは問題ですか? を呼び出すとGlobalMemoryStatus、次の情報が得られます。

  • dwTotalPhys-1063150000(〜1 GB)
  • dwAvailPhys-26735000(〜27 MB)
  • dwAvailPage-1489000000(〜1.4 GB)

ページングファイルに十分なスペースがある場合にWindowsが使用可能な物理メモリを非常に少なくするのは奇妙に思えますが、Windowsの仮想メモリ管理については、これが正常かどうかを知るのに十分な知識がありません。それは...ですか?

メモリでない場合、どのリソース制限に達していますか?私がオンラインで読んだものからERROR_NOT_ENOUGH_MEMORY、アプリケーションがいくつかの制限(GDIオブジェクト、USERオブジェクト、ハンドルなど)のいずれかに達した結果である可能性があり、必ずしもメモリではありません。Windowsが適用する制限の包括的なリストはありますか?どの制限に達しているかを確認する方法はありますか?Googleを試しましたが、体系的な概要が見つかりませんでした。

4

4 に答える 4

4

リストしたどのエラーよりもこのエラーの一般的な原因は、仮想メモリ空​​間の断片化です。これは、合計空きメモリが非常に合理的である一方で、現在割り当てられている仮想メモリスペースのさまざまなビットで空きスペースが断片化されている状況です。したがって、合計で十分な空き容量があるにもかかわらず、単一の連続するブロックでメモリの要求を満たすことができない場合、メモリ不足エラーが発生する可能性があります。

于 2009-09-21T14:23:58.973 に答える
4

すべての可能性を確認してください。

GDIの問題は、無料のGDIViewユーティリティを使用して監視できます。ユーザーがインストーラーなしで開始できる単一のファイル。

また、関連するマシンにProcessExplorerをインストールします。

マシンにアクセスできない場合は、アプリケーションによって監視されているステータスのスクリーンショットを作成するようにユーザーに依頼してください。非常に似ています、これはあなたにいくつかのヒントを与えるでしょう。

于 2009-09-21T19:24:16.117 に答える
3

この場合の原因はCreateCompatibleBitmapでした。明らかに、Windowsは、システムに十分なメモリと十分なGDIリソースがある場合でも、デバイスに依存するビットマップに使用できるメモリにかなり厳しいシステム全体の制限を適用する場合があります(たとえば、このメーリングリストの説明を参照)。(これらのシステム全体の制限は、Windowsがビデオカードのメモリにデバイス依存のビットマップを割り当てる可能性があるためと思われます。)

解決策は、代わりにデバイスに依存しないビットマップ(DIB)を使用することです(ただし、これらはそれほど優れたパフォーマンスを提供しない場合があります)。 このKB記事では、デバイスに最適なDIB形式を選択する方法について説明します。

リソース制限の他の候補(他の人の回答と私自身の調査から):

于 2010-05-10T14:02:41.150 に答える
0

私の答えは少し遅れるかもしれませんが、同じ問題に関する私の最近の経験から、すべてのテストを実行し、段階的に進み、DCを作成し、リリースし、DIBSection代わりにCompatibleBitmap使用し、リークGDI/メモリツールを使用します。

結局(LOL)私はそれを見つけました:

これら2つの呼び出しの優先順位を切り替えていたところ、問題全体が修正されました。

DeleteDC(hdc);       //do it first (always before deleting objects)
DeleteObject(obj);
于 2013-03-08T01:10:43.950 に答える