Quante volte possiamo usare la garbage collection in C # [chiuso]

0

Vorrei usare la garbage collection più volte dopo aver chiamato alcune DLL esterne. E mi chiedo quanto spesso posso fare questo, senza causare problemi alla mia applicazione.

Sto usando i seguenti codici

// Force garbage collection.
GC.Collect();

// Wait for all finalizers to complete before continuing.
GC.WaitForPendingFinalizers();

Qualcuno mi può consigliare su questo, e dove sono i posti adatti che posso inserire i codici di cui sopra. Uso molti array e variabili e memoria nel mio software

    
posta C. Chancellor 24.09.2017 - 20:03
fonte

3 risposte

9

In generale, chiedere al garbage collector di raccogliere è più una raccomandazione che un ordine effettivo.

Non dovresti farlo affatto. Il garbage collector risponderà correttamente alla pressione della memoria. E come ogni ottimizzazione, misura prima. Una volta effettivamente hai una lentezza nei confronti di GC, quindi preoccupati di risolverlo.

    
risposta data 24.09.2017 - 20:20
fonte
2

I would like to use garbage collection several times after calling some external dlls.

Perché senti il bisogno di farlo?

... I wonder how often can I do this, without causing problems to my application.

Direi: Nessuno.

La Garbage Collection raggruppa tutti gli oggetti in tre "Generazioni": la Generazione 0 viene eliminata in modo aggressivo dagli oggetti "morti", "Generazione 1" in modo meno aggressivo e "Generazione 2" se e quando il tempo di esecuzione arriva a preoccuparsi. Dopo l'esecuzione di ogni GC, gli oggetti vengono promossi "su" da una generazione all'altra in modo che, eseguendoli manualmente, si forzino gli oggetti "su" in meno ben gestiti Generazioni, che fondamentalmente gonfia la memoria dell'applicazione invece di liberarla.

    
risposta data 25.09.2017 - 12:38
fonte
0

Dovresti eseguire il GC manualmente quando ti trovi in una situazione in cui sai di aver generato un sacco di spazzatura, ma il garbage collector non lo fa.

Il garbage collector non è poi così intelligente. Non sa nulla su come funziona il tuo programma; tutto quello che sa è che quando c'è la pressione della memoria deve essere raccolta per alleggerirla. Per soddisfare questo vincolo, un garbage collector generazionale deve utilizzare l'algoritmo più stupido possibile: lascia che il maggior numero di garbage build up possibile prima di raccogliere.

Puoi fare di meglio, perché sai come funziona il tuo programma. Non vuoi che le pause GC quando il programma dovrebbe essere reattivo, e non vuoi grossi guadagni di memoria dove si aggrappano a roba che non ha più bisogno. Quindi una buona regola è quella di invocare manualmente il GC in punti in cui è probabile che il sistema generi un sacco di spazzatura e l'utente non si aspetta comunque che sia reattivo, come ad esempio alla fine di un ciclo di caricamento dei dati. (ad esempio, l'utente dice Open... nel menu.) Il garbage collector non sa che è un buon momento per farlo funzionare, ma lo fai.

    
risposta data 25.09.2017 - 13:20
fonte

Leggi altre domande sui tag