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?
Réponses:
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?
la source
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.
la source
use that information
pour 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.String
est implémenté, vous ne concaténerez pas sur une chaîne à l'aide+
d'une boucle.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.
la source
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 ).
la source
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.
la source
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.
la source