Domanda

La nostra applicazione sta venendo a mancare sul computer di un utente specifico con ERROR_NOT_ENOUGH_MEMORY ( "insufficiente archiviazione è disponibile per elaborare questo comando").

L'errore è apparentemente viene sollevata qualche parte nel profondo, nel quadro di Delphi VCL che stiamo usando, quindi non sono sicuro di quale funzione API di Windows è responsabile.

La memoria è un problema? Una chiamata a GlobalMemoryStatus fornisce le seguenti informazioni:

  • dwTotalPhys - 1063150000 (~ 1 GB)
  • dwAvailPhys - 26735000 (~ 27 MB)
  • dwAvailPage - 1489000000 (~ 1,4 GB)

Mi sembra strano a me che di Windows avrebbe lasciato la memoria fisica disponibile ottenere così basso quando così lo spazio disponibile nel file di paging, ma non so abbastanza di gestione della memoria virtuale di Windows' sapere se questo è normale o non. Lo è?

se non la memoria, quindi, che il limite di risorse è stato colpito? Da quello che ho letto on-line, ERROR_NOT_ENOUGH_MEMORY potrebbe essere il risultato dell'applicazione di colpire qualsiasi dei vari limiti (oggetti GDI, oggetti USER, maniglie, ecc) e non necessariamente memoria. Esiste una lista completa di ciò che limita di Windows fa rispettare? C'è un modo per scoprire quale limite è stato colpito? Ho cercato di Google, ma non ho trovato alcuna panoramica sistematica.

È stato utile?

Soluzione 3

Il colpevole in questo caso era CreateCompatibleBitmap . A quanto pare Windows può far rispettare abbastanza severi limiti per l'intero sistema sulla memoria disponibile per le bitmap device-dependent (si veda, ad esempio, questa mailing list di discussione ), anche se il sistema dispone altrimenti un sacco di memoria e un sacco di risorse GDI. (Questi limiti a livello di sistema sono apparentemente perché Windows può assegnare bitmap dipendente dalla periferica nella memoria della scheda video.)

La soluzione è semplice da usare bitmap indipendente (DIB) invece (anche se questi non possono offrire abbastanza buono di un prestazione). Questo articolo KB descrive come scegliere il formato ottimale DIB per un dispositivo.

Altri candidati per i limiti delle risorse (dalle risposte degli altri e la mia ricerca):

  • risorse GDI (da questa risposta) - facilmente controllato con GDIView
  • frammentazione della memoria virtuale (da questa risposta)
  • heap Desktop - vedi qui o qui

Altri suggerimenti

Controlla tutte le possibilità.

GDI-problemi possono essere monitorati utilizzando il GDIView utilità. Il suo un unico file che gli utenti possono iniziare senza un installatore.

Inoltre, installare il ProcessExplorer sulla macchina in questione.

Se non avete accesso alla macchina, chiedere all'utente di fare screenshot dello stato monitorato dalle applicazioni. Molto likeley, questo vi darà qualche suggerimento.

Una causa più comune di questo errore di tutti quelli che hai elencato è la frammentazione di spazio di memoria virtuale. Questa una situazione in cui, mentre la memoria libera totale è abbastanza ragionevole lo spazio libero è frammentato con vari bit della memoria virtuale sia attualmente allocato. Quindi è possibile ottenere un errore di memoria quando una richiesta di memoria non può essere soddisfatta da un unico blocco contiguo nonostante il sufficiente essere in totale libera.

La mia risposta può essere un po 'in ritardo, ma, dal mio ritardo esperienza con questo stesso problema, facendo tutte le prove, andare passo dopo passo, la creazione di DC, rilasciandolo, utilizzando DIBSection invece di CompatibleBitmap, utilizzando strumenti di perdite GDI / memoria , ecc.

Alla fine (LOL) ho scoperto che:

ero Cambiando la priorità di queste due chiamate, quindi tutto il problema è stato risolto.

DeleteDC(hdc);       //do it first (always before deleting objects)
DeleteObject(obj);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top