Gli sviluppatori java dovrebbero conoscere gli algoritmi di garbage collection? [chiuso]

11

In un'intervista mi è stato chiesto di recente se sono a conoscenza di algoritmi di garbage collection.

Sapevo che cos'è la raccolta dei rifiuti, ma non ho mai pensato di apprendere gli algoritmi di raccolta dei rifiuti, poiché come sviluppatore non mi sono mai dovuto preoccupare e il Garbage Collector fa tutto il lavoro duro per me.

Pensate che gli sviluppatori Java dovrebbero conoscere gli algoritmi di garbage collector? Se sì, puoi dirmi a quali devo dare un'occhiata?

    
posta Geek 31.07.2012 - 16:08
fonte

6 risposte

9

Penso che conoscere gli algoritmi di garbage collection non sia importante se sviluppi "software standard" e non piattaforme software. Dovresti avere una conoscenza di base di come funziona un garbage collector e questo è tutto. A meno che non si verifichino ritardi critici nel software causati dalla procedura di Garbage Collection o che sia necessario ottimizzare l'utilizzo della memoria.

Se sei interessato a questi algoritmi, consulta questo mio post: Quali sono gli algoritmi dietro GC a bassa pausa?

    
risposta data 31.07.2012 - 16:18
fonte
7

La raccolta dei rifiuti è un problema informatico interessante e non banale.

Conoscere e comprendere un algoritmo per esso è un'indicazione che hai un interesse piuttosto profondo e la comprensione di questi algoritmi. Anche se non hai studiato l'algoritmo GC di Java, mi stupirebbe se qualcuno fosse in grado di fornire una descrizione ragionevole di quali strutture dati e algoritmi sarebbero usati.

In termini di programmatore Java, sarebbe opportuno che uno sviluppatore potesse descrivere i vantaggi e gli svantaggi di GC, che includerebbe un po 'di conoscenza su come è implementato. Ciò indicherebbe avere un interesse nel modo in cui gli strumenti utilizzati funzionano piuttosto che usarli passivamente. Conoscere i costi ti aiuterà anche a programmare in modo da minimizzare i costi.

Non direi che questa è una "conoscenza necessaria" per guadagnarsi da vivere come sviluppatore Java, ma un'abilità positiva che dimostra che sei capace e disposto ad andare un po 'più in profondità di quello che devi sapere per ottenere il lavoro di oggi fatto.

    
risposta data 31.07.2012 - 17:04
fonte
4

Vedo due motivi per cui uno dovrebbe sapere come funziona il garbage collector (o qualsiasi algoritmo / tecnologia). Eccoli:
1. Ottieni una migliore conoscenza di ciò che accade sotto il codice che scrivi. Questo spesso può aiutarti a scrivere codice più efficiente, che garantirà prestazioni migliori. In alcuni casi questo può essere vitale. (Ho avuto un'esperienza spiacevole quando GWT si affidava al garbage collector del browser e abbiamo avuto un'enorme perdita di memoria con Chrome, quindi abbiamo dovuto vedere cosa ha causato esattamente la perdita.)
2. Tali algoritmi sono sempre (o quasi sempre, no, sempre) affidati a sviluppatori intelligenti, esperti, qualificati ed esperti. Quindi studiare il loro approccio può essere molto utile.

Vedo un'altra ragione per cui ti è stata fatta questa domanda durante l'intervista. Alcuni sviluppatori (il mio ex-collega in particolare) pensano che uno sviluppatore non sia abbastanza intelligente o che lavora sodo, se non sa queste cose. Non sono d'accordo con questa affermazione. Ma comunque, conoscere queste cose è spesso un buon modo per impressionare il tuo intervistatore.

    
risposta data 31.07.2012 - 16:18
fonte
4

Dovresti conoscere la garbage collection generazionale e le specifiche relative alla garbage collection di Java (gli spazi PermGen, Eden e Tenured). Dovresti anche avere familiarità con la raccolta dei rifiuti in generale (ad esempio perché il conteggio dei riferimenti è in genere una cattiva idea e perché il mark-and-sweep è migliore). Consiglierei anche di leggere alcune implementazioni alternative (come il GC "senza pause" in Zing JVM di Azul e il Progetto metronomo ).

    
risposta data 31.07.2012 - 16:23
fonte
3

Dovresti avere ALCUNE conoscenze su come la garbage collection per Java funzioni per due motivi:

In primo luogo, se non sai come funziona, potresti accidentalmente prendere decisioni di progettazione che portano alla peggiore performance della tua applicazione reale. Questo diventa sempre meno probabile man mano che il GC migliora, ma se hai una scelta di algoritmi nella tua app, allora sapere qualcosa sul GC significa che puoi sceglierne uno con la conoscenza di quello che farà, invece di scoprire che ciò causa cattivo comportamento.

In secondo luogo, se non sai come funziona, non è possibile ottimizzare il GC per una determinata applicazione. La maggior parte dei programmatori Java non ha mai bisogno di regolare il GC, poiché i parametri predefiniti funzionano abbastanza bene la maggior parte del tempo. Se fai qualcosa che esce da quel 'la maggior parte del tempo', allora potresti ritrovarti a sintonizzare i parametri del GC. Farlo senza conoscere il GC è solo girando casualmente le manopole - potresti ottenere qualcosa di utile da esso, ma più probabilmente rischi di rovinare le cose peggio.

Quindi, anche se non mi aspetto che un buon programmatore Java sappia tutto ciò che c'è da sapere su GC, mi aspetto che il programmatore sappia a un certo livello in che modo il GC nella JVM sta usando le funzioni e quali sono i compromessi sono per quell'algoritmo GC.

    
risposta data 31.07.2012 - 18:42
fonte
1

Sì, ogni sviluppatore Java dovrebbe sicuramente sapere cosa sta succedendo dietro le quinte della macchina virtuale e questo include il lavoro della garbage collection.

Il livello di conoscenza è sempre un'altra domanda. Non mi aspetterei che un normale sviluppatore spieghi la differenza di un'implementazione reale (dovrei fare qualche ricerca da sola), tuttavia il principio base di ciò che fa un GC e quali sono i pro ei contro contro la gestione della memoria dovrebbe essere chiara.

    
risposta data 31.07.2012 - 18:34
fonte

Leggi altre domande sui tag