2009-06-02 10 views
8

Il mio PC ha 2 GB di memoria RAM. Quando creo un oggetto mesh 3D con una matrice di 70.000 elementi in C# 2008 Express Edition, viene visualizzato il messaggio di errore "Stack Overflow exception handled ...". Se aggiorno la memoria RAM da 2 GB a 4 GB, posso superare questo messaggio di errore?L'aggiornamento della memoria da 2 GB a 4 GB può impedire le eccezioni di Overflow dello stack?

+10

+1 per un overflow dello stack domanda su Stack Overflow. Mi ha dato le risatine. –

+5

Per una questione connessa, vedere qui: stackoverflow.com/questions/941952 ;-p –

+2

Sto scherzando ... qui (davvero, questa volta): http://stackoverflow.com/questions/656226/ –

risposta

11

No. L'aumento della RAM non aumenta le dimensioni dello stack.

Si sta scrivendo il codice che sta causando l'overflow dello stack (forse a causa della ricorsione) e sarà necessario correggerlo.

+3

Infatti; la ricorsione infinita è la più probabile. +1 –

19

Quasi certamente non. Un overflow dello stack (piuttosto che una memoria esaurita) significa che hai consumato lo spazio stack impilabile - ma lo stack è (relativamente parlando) di dimensioni ridotte. Il mucchio è dove è tutto accade ...

Opzioni:

  • fissare il bug ricorsione infinita ...
  • spostare i dati in un/list/qualche negozio di heap-based serie (dove si trova al momento?)
  • evitare la ricorsione profonda
  • evitare le strutture sovradimensionate ... hai delle grosse strutture grasse che dovrebbero essere davvero delle classi? (le strutture si copiano se si sbattono le palpebre)
  • aumentare lo spazio dello stack se si è certi che lo si sta semplicemente capovolgendo e non vale un grande refattore (odio questa risposta) - per fare questo avresti bisogno di generare il tuo thread con uno stack più grande
+0

Nota: questa risposta può essere letta per implicare che l'aumento della RAM fisica aumenterà le dimensioni dell'heap, il che non è il caso. –

+0

Certamente, almeno su un sistema a 64 bit? –

+0

Il punto chiave è che ha uno scarso effetto sullo stack, ma (nonostante i limiti di 2 GB/3 GB di x86) esiste ancora una relazione tra la RAM fisica e la memoria di processo disponibile. –

2

Probabilmente no. Si dovrebbe increase the stack size, questo è quello che dice il messaggio di errore

Modifica: Oppure correggi la ricorsione infinita che è probabile avere nel codice.

2

Uno stack overflow può significare una ricorsione infinita O una molto profondamente annidata.

In modo incidentale, se si dispone di metodi ricorsivi di coda, il x64 JITter li ottimizzerà e non si verificherà alcuno traboccamenti di stack (e la tua ricorsione infinita sarà ... beh infinita).

Così si potrebbe passare a un sistema operativo 64bit, o fissare il codice in modo da non entrare in questo problema (che è più probabile che un bug di un troppo profondo ricorsione annidata ...)

+0

Come mai funziona solo su x64? – SamB

3

memoria fisica solo influenza prestazioni dei programmi in esecuzione nella macchina ma non ha nulla a che fare con i problemi relativi alla memoria di un programma (su sistemi operativi standard, il sistema di inclusione segue regole diverse).

Prima di tutto, perché ho visto questo errore un sacco di volte, parliamo del suo modello di memoria del sistema operativo.

Quasi ogni sistema operativo utente (sto pensando qui su linux, windows, bsd, ecc.) Utilizza un modello di memoria virtuale. Modello di memoria virtuale significa che ogni programma ha accesso completo a una memoria virtuale privata, ovvero una memoria di memoria che non deve avere la memoria fisica corrispondente.

La dimensione di questa memoria virtuale è uguale all'intervallo che può essere risolto da un singolo registro macchina. Sui sistemi operativi a 32 bit significa circa 4 GB. Ora, indipendentemente dalla quantità effettiva di memoria del tuo sistema, il tuo programma penserà sempre di avere 4 GB.

Ora, questi 4 GB sono, infatti, condivisi tra il tuo programma e lo spazio che il sistema operativo riserva per la gestione dei dati in modalità kernel, oltre a mantenere le strutture necessarie al tuo programma. Essendo pratico, puoi contare con circa 2 o 3 GB a seconda della configurazione (la configurazione del tuo sistema operativo). Tutto ciò non ha nulla a che fare con la quantità di memoria fisica che possiedi, puoi avere 256 MB di RAM e il tuo programma penserà che abbia 2 GB a sua disposizione.

Quando si allocare la memoria, il sistema di solito non prevede esattamente la quantità di memoria che si chiede. Invece utilizza pagine, che sono blocchi di memoria riservata (ad esempio 4KB) assegnata al processo. Quando lo fai, il sistema operativo registra quella "pagina" come allocata, ma questa è ancora nella memoria virtuale. Internamente, il sistema operativo gestisce quali di queste pagine sono conservate nella memoria fisica e quali di esse sono nello scambio (nell'HDD). Questo è il motivo per cui aumentare la tua RAM aumenta le tue prestazioni (più pagine possono essere nella memoria principale allo stesso tempo, e devi leggere meno dall'HDD) ma non ti aiuterà con un overflow dello stack (o un'eccezione Out of memory di la via).

E che perché aumentare la RAM non sarà di aiuto.

Infine, sull'eccezione Overflow dello stack ... beh È difficile dirlo senza vedere il codice effettivo, alcune buone risposte sono già state fornite.

Principalmente l'overflow dello stack proviene da una ricorsione infinita, diretta o indiretta (A -> B -> C -> A) ma nel tuo caso concreto direi che stai solo assegnando a molti dati lo stack.

Si dispone di un array di dimensioni 70000. Sto indovinando che la matrice è piena di tipi di valore, che sono allocati nello stack che, se ricordo correttamente (e per favore non prendi questo come fatto) è 1MB in .NET, che potrebbe essere il motivo per cui stai ricevendo il tuo stack overflow.

1

In realtà, no. Ma ho una ragione diversa: Windows XP può gestire solo fino a 2 GB a meno che non si specifica una specifica opzione di avvio in boot.ini. (Il parametro/3gb.) Nella migliore delle ipotesi, Windows XP e Vista arrivano fino a 3 GB di RAM e questo è fondamentalmente il limite per Windows. Vedere This link per ulteriori informazioni su questi limiti.

Aumentare la RAM e correggere l'applicazione per superare il limite di 2 GB potrebbe risolvere l'overflow dello stack, poiché potrebbe aumentare le dimensioni dello stack. Potrebbe anche solo ritardare il momento di questo overflow dello stack poiché, come è stato suggerito, il tuo codice si trova in un ciclo ricorsivo senza fine e continuerà a funzionare fino a esaurimento delle risorse.

Se si utilizza la ricorsione, tenere presente quanto segue: qualsiasi operazione eseguita utilizzando la ricorsione può essere riscritta senza ricorrere alla ricorsione. Non ci sono eccezioni a questa regola, anche se il codice non sarà più facile da leggere.

+1

In realtà il flag/3Gb modifica la quantità massima di memoria per processo che può essere allocata. Windows XP e Vista saranno entrambi felicemente con 4Gb di RAM, ma consentiranno solo l'accesso a circa 3,5 GB di esso, con i rimanenti 500 MB di spazio indirizzabile per altre memorie come schede video, ecc. –

+0

Vero, ma dal punto di vista dell'applicazione il tuo l'applicazione sarà ancora limitata a 3 GB. L'aggiornamento a 4 GB significa meno swapping ma non più memoria per il processo stesso. –

0

Non so per C#, ma in java, errore StackOverflow significa che si sta creando un'istanza di una classe nella classe che sono stati già istanziato nella classe che si sta tentando di esempio

Problemi correlati