Le generazioni di GC hanno uno scopo (per un programmatore di applicazioni) diverso dalla risposta alle domande "difficili" delle risorse umane?

1

Sto usando C # per diversi anni, mai realmente volendo (fino a quando ho davvero bisogno di farlo) per scavare nella sua meccanica "profonda" e per intervenire nel lavoro di GC, nel codice compilato da IL e così via.

Il mio punto è che se hai mai bisogno di chiamare GC anche manualmente (parlando in generale - per "aiutare" i costruttori e le strutture di C # o di .NET a fare il loro lavoro), allora è 99% la probabilità che tu faccia qualcosa di sbagliato rispetto all'1% che hai effettivamente bisogno di questo.

Questa è una sorta di capriccio dei programmatori della "vecchia scuola" - piuttosto che studiare le librerie e le strutture esistenti, inventeranno una bicicletta ancora e ancora, ostentando la loro "profonda" conoscenza, mettendo ogni "schema" di cui hanno sentito parlare e producendo un "capolavoro" che nessuno sarà in grado di comprendere (anche creatore egli stesso diverse falene più tardi).

Tuttavia, torna all'argomento. Le generazioni di GC sono una delle domande molto popolari che mi sono state rivolte da alcune risorse umane, inoltre ho letto alcuni articoli di "preparazione per l'intervista" relativi a questo argomento, ma non ho mai visto nulla su come effettivamente puoi gestirli da solo. Suppongo, non puoi? Ho fatto una ricerca di superficie e ho trovato solo il tipo di "comprensione di GC". Ad esempio, puoi sapere come funziona realmente il compilatore, ma hai intenzione di "aiutarlo" a compilare il tuo programma? E se non lo farai, allora forse meglio usare il tuo tempo per studiare alcuni tipi di ASP.NET vNext?

Quindi, le generazioni di GC hanno uno scopo (per un programmatore di applicazioni) diverso dalla risposta alle "difficili" domande delle risorse umane?

    
posta yaapelsinko 26.10.2014 - 06:51
fonte

2 risposte

16

Conoscenza della GC generazionale - l'idea generale, non quanto è grande esattamente lo spazio giovane nella versione CLR di Microsoft x.y - è molto simile alla conoscenza della compilazione JIT, dei principi del sistema operativo, dell'assemblaggio, dell'hardware. Non ne hai praticamente mai bisogno per produrre un prodotto funzionante. Tuttavia, può accelerare le cacce ai bug e i tentativi di ottimizzazione dicendoti cosa probabilmente non funzionerà. Due esempi:

Riutilizzare / raggruppare gli oggetti sembra una buona idea per ridurre il lavoro di GC. Se non sai molto su GC internals, è così. Ma in un contesto generazionale, un oggetto che altrimenti sarebbe di breve durata verrà gettato su una generazione o due se entra in un pool. La deallocazione ora richiede un GC importante, che è sia più raro che più costoso, e può anche aver luogo un assortimento di altri piccoli effetti (a seconda che l'oggetto contenga riferimenti e se tali riferimenti facciano riferimento a oggetti giovani).

Quindi, un pool deve generalmente impedire che molte creazioni di oggetti siano redditizie, cosa che ora si sa senza dover implementare, profilare e scartare il pooling per qualcosa che probabilmente non trarrà vantaggio dal pooling.

Una conoscenza più approfondita limita anche le ipotesi assurde. Vorrei avere un quarto per ogni principiante confuso che ho visto cacciando un (molto reale) insetto inseguendo la stupidità immaginata dalla parte del CG. Questo è in gran parte legato alle cose di raggiungibilità, ma ho anche visto alcune domande che potrebbero essere saltate due modifiche in futuro se il poster avesse avuto una buona conoscenza delle generazioni.

Infine, non pensi che i GC siano di semplice interesse? Forse sono solo io e, a dire il vero, forse è la ragione principale per cui ho imparato queste cose per cominciare.

    
risposta data 26.10.2014 - 10:30
fonte
1

(Non conosco C # e non ho mai programmato un sistema operativo Windows)

Leggi almeno la wiki su Garbage Collection , e se possibile il Manuale GC

Una GC di copia generazionale fa l'ipotesi (generalmente giustamente) che la maggior parte dei valori giovani sono temporanei e moriranno presto, e inversamente che la maggior parte dei vecchi valori durerà di più (e non morirà presto). Quindi un GC generazionale sta concentrando il suo lavoro sulla generazione più giovane. Le generazioni precedenti non vengono elaborate spesso, perché contengono valori di lunga vita che probabilmente dureranno di più.

Vedi anche questa domanda SO .

Potresti volere (di solito in modo errato, perché non ne vale la pena) forzare GC quando sai che molti valori vecchi stanno diventando inutili. Quindi i GC generazionali sono molto utili (perché sono efficienti), ma ci sono pochi casi in cui si vuole forzare un GC (non lo farò, a meno che il benchmark non indichi che ne vale la pena).

    
risposta data 26.10.2014 - 08:52
fonte

Leggi altre domande sui tag