Gli sviluppatori Java dovrebbero conoscere gli algoritmi di Garbage Collection? [chiuso]


11

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

Sapevo cosa fosse la garbage collection ma non ho mai pensato di imparare sugli algoritmi di garbage collection poiché come sviluppatore non ho mai dovuto preoccuparmene e il Garbage Collector fa tutto il duro lavoro per me.

Pensate che gli sviluppatori Java dovrebbero conoscere gli algoritmi di Garbage Collector? Se sì, puoi dirmi quali dovrei esaminare?



1
Sì, dovrebbero. Altrimenti corrono il rischio di scrivere software che si rompe sotto carico pesante.
quant_dev,

Risposte:


9

Penso che conoscere gli algoritmi di garbage collection non sia affatto importante se si sviluppa "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 garbage collection o non sia necessario ottimizzare l'utilizzo della memoria.

Se sei interessato a quegli algoritmi, ti preghiamo di consultare questo mio post: quali sono gli algoritmi dietro GC a bassa pausa?


7

La garbage collection è un problema informatico interessante, non banale.

Conoscere e comprendere un algoritmo per questo è un'indicazione che hai un interesse e una comprensione abbastanza profondi di questi algoritmi. Anche se non hai studiato l'algoritmo GC di Java, mi impressionerebbe se qualcuno fosse in grado di fornire una descrizione ragionevole di quali strutture di dati e algoritmi verrebbero utilizzati.

In termini di programmatore Java, sarebbe utile se uno sviluppatore potesse descrivere i vantaggi e gli svantaggi di GC, che includerebbe un po 'di conoscenza su come è implementato. Ciò indicherebbe l'interesse per il modo in cui funzionano gli strumenti che utilizzi piuttosto che utilizzarli passivamente. Conoscere i costi ti aiuterebbe anche a programmare in modo da ridurre al minimo i costi.

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


2
Conoscere una comprensione delle basi con cui sarei d'accordo (capire le cose ti rende un programmatore migliore). Il problema è che se conosci i dettagli complessi e poi use that informationprogetta il tuo codice. Ciò può causare problemi poiché il GC è migliorato e le tue ipotesi su come il GC non è più valido e il codice diventa non ottimale (e nel peggiore dei casi potrebbe ostacolare il GC). Buono a sapersi, ma dovresti progettare il tuo codice usando le migliori pratiche non tenendo presente un'implementazione specifica; i compilatori e GC migliorano sempre e le ottimizzazioni delle macro alla fine non saranno utili.
Martin York,

Stavo pensando di più sul fatto che se sai qualcosa su come Stringviene implementato, non ti concatenerai su una stringa usando +in un ciclo.
JohnMcG

4

Vedo due motivi per cui si dovrebbe sapere come funziona Garbage Collector (o qualsiasi algoritmo / tecnologia). Eccoli:
1. Ottieni una migliore conoscenza di ciò che accade sotto il codice che scrivi. Questo può spesso 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 basava sul 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) fidato di sviluppatori intelligenti, qualificati, qualificati ed esperti. Quindi studiare il loro approccio può essere molto utile.

Vedo un altro motivo per cui ti è stata posta questa domanda durante il colloquio. Alcuni sviluppatori (in particolare il mio ex collega) pensano che uno sviluppatore non sia abbastanza intelligente o operoso, se non conosce queste cose. Non sono d'accordo con questa affermazione. Comunque, conoscere queste cose è spesso un buon modo per impressionare il tuo intervistatore.


1
Sono d'accordo con (2) e metà di (1) (aiuta nel debug). Ma ci sono pericoli in (1) e progettare il codice in modo che funzioni con un'implementazione particolare di un GC in quanto non sarà più ottimale quando il GC verrà migliorato o si passerà a un'implementazione con un diverso tipo di GC.
Martin York,

@Loki Astari, hai ragione sul fatto che sia pericoloso per implementazioni specifiche. D'altra parte, ci sono cose che non cambiano (almeno per un lungo periodo), ad esempio i principi di garbage collection di .NET.
superM

@superM: In realtà, il GC di Mono è significativamente diverso da quello di Microsoft ed è in procinto di essere sostituito con un altro completamente diverso.
Jörg W Mittag,

@superM: Non sembra così lento di un'evoluzione di Java per me: en.wikipedia.org/wiki/Java_version_history (sembra che una volta all'anno ci sia una nuova patch o un aggiornamento). Con una nuova versione il prossimo anno. Ora, ciò non significa che GC sia aggiornato ogni volta, ma ne mostri il potenziale.
Martin York,

@Loki Astari, esatto. Molto nello sviluppo del software continua a cambiare rapidamente e il nostro compito è quello di tenerlo al passo. Inoltre, tutte le modifiche si basano su ciò che esiste già, quindi non mi aspetto cambiamenti radicali in 1 o 2 versioni.
superM

4

Dovresti conoscere la garbage collection generazionale e le specifiche sulla garbage collection 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 è di solito una cattiva idea e perché mark-and-sweep è migliore). Consiglierei anche di leggere alcune implementazioni alternative (come il GC "senza pause" di Zul JVM di Azul e il progetto Metronome in tempo reale di IBM ).


3

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

Innanzitutto, se non sai come funziona, potresti prendere accidentalmente decisioni di progettazione che portano a prestazioni nel caso peggiore nella tua applicazione reale. Ciò diventa sempre meno probabile man mano che il GC migliora, ma se hai una scelta di algoritmi nella tua app, quindi conoscere qualcosa sul GC significa che puoi sceglierne uno con la conoscenza di ciò che sta per fare, invece di scoprire che causa cattivo comportamento.

In secondo luogo, se non sai come funziona, non puoi assolutamente mettere a punto il GC per una determinata applicazione. La maggior parte dei programmatori Java non ha mai bisogno di mettere a punto il GC, poiché i parametri predefiniti funzionano abbastanza bene per la maggior parte del tempo. Se fai qualcosa che esce da quella "maggior parte del tempo", allora potresti ritrovarti a sintonizzare i parametri GC. Farlo senza conoscere il GC significa semplicemente ruotare le manopole in modo casuale: potresti ricavarne qualcosa di utile, ma più probabilmente rovinerai le cose peggio.

Quindi, anche se non mi aspetto che un buon programmatore Java sappia tutto sotto il sole su GC, mi aspetto che quel programmatore sappia ad un certo livello come il GC nella JVM sta usando le funzioni e quali sono i compromessi Algoritmo GC.


1

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

Il livello di conoscenza è comunque un'altra domanda. Non mi aspetto che uno sviluppatore normale spieghi la differenza di un'implementazione effettiva (dovrei fare qualche ricerca da solo), tuttavia il principio di base di ciò che fa un GC e quali dovrebbero essere i pro ei contro contro la gestione della memoria chiaro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.