Ich wurde kürzlich in einem Interview gefragt, ob ich etwas über Garbage Collection-Algorithmen weiß.
Ich wusste, was Garbage Collection ist, aber ich habe nie wirklich darüber nachgedacht, etwas über Garbage Collection-Algorithmen zu lernen, da ich mich als Entwickler nie darum kümmern musste und der Garbage Collector die ganze harte Arbeit für mich erledigt.
Denken Sie, dass Java-Entwickler über Garbage Collector-Algorithmen Bescheid wissen sollten? Wenn ja, können Sie mir sagen, welche ich untersuchen soll?
Antworten:
Ich denke, dass es überhaupt nicht wichtig ist, Garbage Collection-Algorithmen zu kennen, wenn Sie "Standardsoftware" und keine Softwareplattformen entwickeln. Sie sollten ein grundlegendes Verständnis dafür haben, wie ein Garbage Collector funktioniert, und das war's auch schon. Es sei denn, Sie haben kritische Verzögerungen in Ihrer Software aufgrund der Speicherbereinigung oder müssen die Speichernutzung optimieren.
Wenn Sie an diesen Algorithmen interessiert sind, lesen Sie bitte meinen Beitrag: Welche Algorithmen stecken hinter der GC mit niedriger Pause?
quelle
Die Müllabfuhr ist ein interessantes, nicht triviales Informatikproblem.
Das Kennen und Verstehen eines Algorithmus dafür ist ein Hinweis darauf, dass Sie ein ziemlich tiefes Interesse und Verständnis für diese Algorithmen haben. Selbst wenn Sie den GC-Algorithmus von Java nicht studiert haben, würde es mich beeindrucken, wenn jemand in der Lage wäre, eine vernünftige Beschreibung der verwendeten Datenstrukturen und Algorithmen zu geben.
Als Java-Programmierer wäre es gut, wenn ein Entwickler die Vor- und Nachteile von GC beschreiben könnte, einschließlich ein wenig Wissen darüber, wie es implementiert wird. Dies würde darauf hinweisen, dass Sie ein Interesse daran haben, wie die von Ihnen verwendeten Tools funktionieren, anstatt sie nur passiv zu verwenden. Wenn Sie die Kosten kennen, können Sie auch so programmieren, dass die Kosten minimiert werden.
Ich würde nicht sagen, dass dies "erforderliches Wissen" ist, um seinen Lebensunterhalt als Java-Entwickler zu verdienen, aber eine Plus-Fähigkeit, die zeigt, dass Sie in der Lage und bereit sind, ein wenig tiefer zu gehen, als Sie wissen müssen, um die heutige Arbeit zu erledigen.
quelle
use that information
Ihren Code entwerfen. Dies kann zu Problemen führen, da der GC verbessert wird und Ihre Annahmen darüber, wie der GC nicht mehr gilt und der Code nicht optimal wird (und im schlimmsten Fall den GC behindern können). Gut zu wissen, aber Sie sollten Ihren Code unter Verwendung von Best Practices entwerfen, die nicht auf eine bestimmte Implementierung ausgerichtet sind. Die Compiler und GC verbessern sich ständig und Makrooptimierungen werden letztendlich einfach nicht mehr nützlich sein.String
Implementierung wissen , werden Sie nicht mit+
einer Schleife in eine Zeichenfolge verketten .Ich sehe zwei Gründe, warum man wissen sollte, wie Garbage Collector (oder ein Algorithmus / eine Technologie) funktioniert. Hier sind sie:
1. Sie erhalten ein besseres Wissen darüber, was unter dem von Ihnen geschriebenen Code vor sich geht. Dies kann Ihnen oft helfen, effizienteren Code zu schreiben, der eine bessere Leistung garantiert. In einigen Fällen kann dies von entscheidender Bedeutung sein. (Ich hatte eine unangenehme Erfahrung, als GWT sich auf den Garbage Collector des Browsers stützte, und wir hatten einen großen Speicherverlust mit Chrome. Wir mussten also sehen, was genau den Verlust verursacht hat.)
2. Solche Algorithmen sind immer (oder fast immer) nein, immer) vertrauten intelligenten, qualifizierten, qualifizierten und erfahrenen Entwicklern. Das Studium ihres Ansatzes kann daher sehr nützlich sein.
Ich sehe einen weiteren Grund, warum Ihnen diese Frage beim Interview gestellt wurde. Einige Entwickler (insbesondere mein Ex-Kollege) denken, dass ein Entwickler nicht klug oder fleißig genug ist, wenn er / sie solche Dinge nicht weiß. Ich bin mit dieser Aussage nicht einverstanden. Aber solche Dinge zu wissen ist oft eine gute Möglichkeit, Ihren Interviewer zu beeindrucken.
quelle
Sie sollten über die Garbage Collection der Generationen und die Besonderheiten der Java-Garbage Collection (die Bereiche PermGen, Eden und Tenured) informiert sein. Sie sollten auch mit der Speicherbereinigung im Allgemeinen vertraut sein (z. B. warum Referenzzählung normalerweise eine schlechte Idee ist und warum Mark-and-Sweep besser ist). Ich würde auch empfehlen, sich über einige alternative Implementierungen zu informieren (wie den "pausenlosen" GC in Azul's Zing JVM und IBMs Echtzeit- Metronom-Projekt ).
quelle
Sie sollten einige Kenntnisse darüber haben, wie die Garbage Collection für Java aus zwei Gründen funktioniert:
Erstens, wenn Sie nicht wissen, wie es funktioniert, können Sie versehentlich Entwurfsentscheidungen treffen, die zu einer Worst-Case-Leistung in Ihrer tatsächlichen Anwendung führen. Dies wird mit zunehmender Verbesserung des GC immer unwahrscheinlicher. Wenn Sie jedoch eine Auswahl an Algorithmen in Ihrer App haben, bedeutet das Wissen über den GC, dass Sie einen auswählen können, der weiß, was er tun wird, anstatt herauszufinden, was er verursacht schlechtes Benehmen.
Zweitens, wenn Sie nicht wissen, wie es funktioniert, können Sie den GC möglicherweise nicht für eine bestimmte Anwendung optimieren. Die meisten Java-Programmierer müssen den GC nie optimieren, da die Standardparameter die meiste Zeit gut genug funktionieren. Wenn Sie etwas tun, das "die meiste Zeit" davon abweicht, müssen Sie möglicherweise die GC-Parameter anpassen. Wenn Sie dies ohne Kenntnis des GC tun, drehen Sie die Knöpfe nur zufällig - Sie könnten etwas Nützliches daraus machen, aber es ist wahrscheinlicher, dass Sie die Dinge noch schlimmer machen.
Obwohl ich nicht erwarten würde, dass ein guter Java-Programmierer alles unter der Sonne über GC weiß, würde ich erwarten, dass dieser Programmierer auf einer bestimmten Ebene weiß, wie der GC in der JVM Funktionen verwendet und welche Kompromisse dafür bestehen GC-Algorithmus.
quelle
Ja, jeder Java-Entwickler sollte auf jeden Fall wissen, was sich hinter den Kulissen der virtuellen Maschine abspielt, und dazu gehört auch die Arbeit der Garbage Collection.
Der Wissensstand ist jedoch eine andere Frage. Ich würde nicht erwarten, dass ein normaler Entwickler den Unterschied einer tatsächlichen Implementierung erklärt (ich müsste dies selbst untersuchen), jedoch das Grundprinzip dessen, was ein GC tut und welche Vor- und Nachteile es hat, den Speicher selbst zu verwalten klar.
quelle