2012-07-26 11 views
5

Ho appena iniziato con .NET Framework con C# come lingua. Ho in qualche modo capito il concetto di GC in Java e ho avuto una rivisitazione dello stesso concetto in .NET oggi.La Garbage Collection ha mai influenzato lo stack?

In C#, i tipi di valore vengono messi nello stack (come nel caso di Java, dove le variabili locali vengono messe nello stack). Ma in C#, anche struct è incluso nei tipi di valore. Quindi, anche i struct vengono messi in pila. Nel peggiore dei casi, dove ci sono molte chiamate di metodo, e lo stack è popolato pesantemente con molti metodi, e ogni metodo ha molti tipi di valore locale, e molti struct s che hanno molti tipi di valore locale, il Garbage Collector avrà mai effetto lo stack? Da quello che ho cercato (e in parte ciò che mi è stato insegnato), capisco che non lo farà. Soprattutto perché la manipolazione del contenuto dello stack comporterà un sacco di spese generali, e inoltre, GC consulta solo gli stack per cercare i riferimenti e nient'altro.

Solo per aggiungere un'altra domanda relativa allo stesso argomento: Forzare una chiamata a GC (come System.gc() in Java, non sono sicuro dell'equivalente C#), non garantisce che la routine GC venga chiamata allora e lì. Quindi, dove dovrei effettuare una chiamata - dove mi aspetto che abbia bisogno che il GC funzioni, o in un posto casuale in quanto non vi è alcuna garanzia che la mia chiamata attiverà immediatamente il GC? O dovrei lasciare le cose al Runtime Environment e non preoccupartene?

Nota: ho aggiunto il tag Java perché sto cercando di collegare i concetti da lì. Capisco che il funzionamento interno di GC nei due ambienti di runtime separati sarà sicuramente diverso, ma immagino che il concetto di base sarebbe lo stesso.

risposta

2

No garbage collect non ha effetto sugli oggetti sullo stack java.

GC riguarda solo gli oggetti nell'heap di jvm. Il processo Java GC è a più livelli e può essere molto complesso e vale la pena di essere letto. Controlla un sito come: http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html per capire bene come funziona.

Per quanto riguarda forzare la GC del sistema è una cattiva idea. La jvm avrà un'idea migliore di quando è necessario eseguire un GC. Se stai tentando di allocare un oggetto grande, jvm assicurerà che lo spazio è lì per te senza che tu debba dirlo per eseguire il GC.

EDIT Il mio male, sei più preoccupato per C# di java. Si applicano gli stessi principi di gestione della memoria, lo stack non è influenzato, non si esegue esplicitamente un GC, ecc. C# è progettato per funzionare in un ambiente simile a java. http://msdn.microsoft.com/en-us/library/ms973837.aspx

+0

Grazie per aver risposto. Tornerò dopo aver letto di più su di esso. –

1

No. Il GC AFAIK non ha effetto sulla pila. Effettua solo la memoria HEAP. Il frame dello stack verrà creato dopo le chiamate al metodo e verrà rimosso all'uscita del metodo.

EDIT

Questo MSDN article spiega come funziona GC nel framework .NET.

+0

funziona per Java, C# o entrambi? –

+0

Questo è solo per JAVA. Non so molto di C#, ma la mia ipotesi è C# segue simili prinicples. – kosa

+0

La mia domanda è nel contesto di C#, ma grazie per la vostra risposta. –

2

pile non hanno bisogno l'assistenza di un garbage collector; poiché, mentre si esce dai frame di stack (lo scopo dell'esecuzione corrente all'interno dello stack), l'intero frame, incluso il contenuto, viene liberato (e sovrascritto) mentre si crea un nuovo stack frame.

function foo(int a, int b) { 
    int i; 
    doStuff(); 
} 

crea uno stack frame (visualizzazione ruvida)

---- Frame Start ---- 
(value for parameter a) 
(value for parameter b) 
(other items needed for tracking execution) 
(extra stack frame space 
    (value for stack allocated i) 
) 
---- End of Frame ---- 

Entrando una funzione, sovrapporre le variabili allocate sono assegnate come il telaio viene allocata, all'uscita del telaio, l'intero frame viene scartato, deallocando la memoria per le variabili allocate nel frame.

Ricordare che Java alloca in genere i riferimenti agli oggetti e impila primitive locali nello stack, non interi oggetti.Solo alcune ottimizzazioni recenti consentono l'allocazione in pila di oggetti non raggiungibili al di fuori del frame; che ha tali condizioni su di esso che non è considerato qualcosa su cui puoi contare.

Detto ciò, i riferimenti nel frame dello stack in genere puntano all'heap, che è garbage collection normalmente.

+0

Capisco il concetto di stack. Ma avevo chiesto nel peggiore dei casi in cui lo stack si riempisse di molte chiamate di funzione (una funzione chiama l'altro e così via e così via, dove negli altri frame non vengono estratti dallo stack). Ma in qualche modo capisco ora che non importa cosa, lo stack non viene mai influenzato. –

+1

Se sono necessari sufficienti frame di stack che superano la memoria allocata per lo spazio di stack, i frame non vengono spostati nell'heap. Invece si verifica un errore di stackoverflow e l'elaborazione si interrompe. –

+0

Vorrei poter alterare ancora di più la tua risposta e persino accettarla, mi è piaciuta molto perché mi hai fatto capire bene lo scenario dello stack e mi ha anche ricordato l'esistenza di qualcosa chiamato stackoverflowerror. Ma l'altra risposta ha fornito una soluzione globale. Grazie comunque comunque. –

1

La raccolta dati in formato PDF viene illustrata in dettaglio in Garbage Collection su MSDN. Il Garbage Collector tiene traccia della memoria solo nell'Heap gestito.