Les développeurs Java devraient-ils connaître les algorithmes de collecte de déchets? [fermé]


11

On m'a récemment demandé dans une interview si je connaissais des algorithmes de collecte de déchets.

Je savais ce qu'est la collecte des ordures mais je n'ai jamais vraiment pensé à apprendre les algorithmes de collecte des ordures car en tant que développeur, je n'ai jamais eu à m'en soucier et le garbage collector fait tout le travail pour moi.

Pensez-vous que les développeurs Java devraient connaître les algorithmes de ramasse-miettes? Si oui, pouvez-vous me dire lesquels devrais-je étudier?



1
Oui, ils devraient. Sinon, ils courent le risque d'écrire un logiciel qui se brise sous une lourde charge.
quant_dev

Réponses:


9

Je pense que connaître les algorithmes de collecte des ordures n'est pas important du tout si vous développez des "logiciels standard" et non des plates-formes logicielles. Vous devriez avoir une compréhension de base du fonctionnement d'un ramasse-miettes et c'est tout. Sauf si vous rencontrez des retards critiques dans votre logiciel causés par la récupération de place ou si vous devez optimiser l'utilisation de la mémoire.

Si vous êtes intéressé par ces algorithmes, veuillez consulter cet article: Quels sont les algorithmes derrière GC à faible pause?


7

La collecte des ordures est un problème informatique intéressant et non trivial.

Connaître et comprendre un algorithme pour cela est une indication que vous avez un intérêt assez profond et une compréhension de ces algorithmes. Même si vous n'avez pas étudié l'algorithme GC de Java, cela m'impressionnerait si quelqu'un pouvait donner une description raisonnable des structures de données et des algorithmes qui seraient utilisés.

En tant que programmeur Java, il serait bon qu'un développeur puisse décrire les avantages et les inconvénients du GC, ce qui comprendrait un peu de connaissances sur la façon dont il est mis en œuvre. Cela indiquerait un intérêt pour le fonctionnement des outils que vous utilisez plutôt que de les utiliser passivement. Connaître les coûts vous aiderait également à programmer d'une manière qui minimise les coûts.

Je ne dirais pas qu'il s'agit de "connaissances requises" pour gagner sa vie en tant que développeur Java, mais d'une compétence supplémentaire qui montre que vous êtes capable et disposé à aller un peu plus loin que ce que vous devez savoir pour faire le travail d'aujourd'hui.


2
Connaître une compréhension des bases avec laquelle je serais d'accord (comprendre les choses fait de vous un meilleur codeur). Le problème est que si vous connaissez les détails complexes, puis use that informationpour concevoir votre code. Cela peut poser des problèmes lorsque le GC est amélioré et que vos hypothèses sur la façon dont le GC ne tient plus et que le code devient non optimal (et dans le pire des cas peuvent gêner le GC). Bon à savoir, mais vous devez concevoir votre code en utilisant les meilleures pratiques sans penser à une implémentation spécifique; les compilateurs et GC s'améliorent toujours et les optimisations de macros finiront par ne plus être utiles.
Martin York

Je pensais plus dans le sens que si vous savez quelque chose sur la façon dont Stringest implémenté, vous ne concaténerez pas sur une chaîne à l'aide +d'une boucle.
JohnMcG

4

Je vois deux raisons pour lesquelles on devrait savoir comment fonctionne le ramasse-miettes (ou tout algorithme / technologie). Les voici:
1. Vous obtenez une meilleure connaissance de ce qui se passe sous le code que vous écrivez. Cela peut souvent vous aider à écrire du code plus efficace, ce qui garantira de meilleures performances. Dans certains cas, cela peut être vital. (J'ai eu une expérience désagréable lorsque GWT s'appuyait sur le garbage collector du navigateur, et nous avons eu une énorme fuite de mémoire avec Chrome. Nous avons donc dû voir ce qui a exactement causé la fuite.)
2. De tels algorithmes sont toujours (ou presque toujours, non, toujours) fait confiance à des développeurs intelligents, qualifiés, qualifiés et expérimentés. L'étude de leur approche peut donc être très utile.

Je vois une autre raison pour laquelle on vous a posé une telle question lors de l'entretien. Certains développeurs (mon ex-collègue en particulier) pensent qu'un développeur n'est pas suffisamment intelligent ou travailleur, s'il ne sait pas de telles choses. Je ne suis pas d'accord avec cette affirmation. Mais de toute façon, savoir de telles choses est souvent un bon moyen d'impressionner votre interlocuteur.


1
Je suis d'accord avec (2) et la moitié de (1) (aide au débogage). Mais il y a des dangers dans (1) et concevez votre code pour fonctionner avec une implémentation particulière d'un GC, car il ne sera plus optimal lorsque le GC sera amélioré ou que vous passerez à une implémentation avec un type de GC différent.
Martin York

@Loki Astari, vous avez raison de dire que cela est dangereux pour des implémentations spécifiques. Mais, d'autre part, il y a des choses qui ne changent pas (pendant longtemps, au moins), les principes de garbage collection de .NET par exemple.
superM

@superM: En fait, le GC de Mono est très différent de celui de Microsoft et est en train d'être remplacé par un autre complètement différent.
Jörg W Mittag

@superM: Ça ne me semble pas si lent d'une évolution de Java: en.wikipedia.org/wiki/Java_version_history (on dirait qu'une fois par an il y a un nouveau patch ou une mise à jour). Avec une nouvelle version l'année prochaine. Maintenant, cela ne signifie pas que GC est mis à jour à chaque fois, mais en montre le potentiel.
Martin York

@Loki Astari, c'est vrai. Beaucoup de choses dans le développement de logiciels évoluent rapidement, et notre travail consiste à les suivre. En outre, tous les changements sont basés sur ce qui existe déjà, donc je ne m'attendrais pas à des changements radicaux dans les versions 1 ou 2.
superM

4

Vous devez connaître la récupération de place générationnelle et les détails de la récupération de place Java (les espaces PermGen, Eden et Tenured). Vous devez également être familier avec la récupération de place en général (comme pourquoi le comptage de références est généralement une mauvaise idée, et pourquoi le marquage et le balayage sont meilleurs). Je recommanderais également de lire quelques implémentations alternatives (comme le GC "sans pause" dans la JVM Zing d'Azul et le projet Metronome en temps réel d'IBM ).


3

Vous devriez avoir QUELQUES connaissances sur le fonctionnement du garbage collection pour Java pour deux raisons:

Tout d'abord, si vous ne savez pas comment cela fonctionne, vous pouvez accidentellement prendre des décisions de conception qui conduisent à des performances optimales dans votre application réelle. Cela devient de moins en moins probable à mesure que le GC s'améliore, mais si vous avez le choix d'algorithmes dans votre application, alors connaître quelque chose sur le GC signifie que vous pouvez en choisir un en sachant ce qu'il va faire, au lieu de découvrir qu'il provoque mauvais comportement.

Deuxièmement, si vous ne savez pas comment cela fonctionne, vous ne pouvez pas régler le GC pour une application donnée. La plupart des programmeurs Java n'ont jamais besoin de régler le GC, car les paramètres par défaut fonctionnent assez bien la plupart du temps. Si vous faites quelque chose qui sort de ce «la plupart du temps», vous pouvez vous retrouver à régler les paramètres du GC. Faire cela sans connaître le GC revient simplement à tourner les boutons au hasard - vous pourriez en tirer quelque chose d'utile, mais plus probablement vous ferez le pire.

Donc, même si je ne m'attendrais pas à ce qu'un bon programmeur Java sache tout sous le soleil à propos du GC, je m'attendrais à ce que le programmeur sache à un certain niveau comment le GC dans la JVM utilise les fonctions et quels sont les compromis pour cela Algorithme GC.


1

Oui, chaque développeur Java doit absolument savoir ce qui se passe dans les coulisses de la machine virtuelle et cela inclut le travail de la récupération de place.

Le niveau de connaissances cependant est une autre question. Je ne m'attendrais pas à ce qu'un développeur normal explique la différence d'une implémentation réelle (je devrais faire des recherches à ce sujet moi-même), mais le principe de base de ce que fait un GC et quels devraient être les avantages et les inconvénients de la gestion de la mémoire vous-même clair.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.