Sollten Java-Entwickler etwas über Garbage Collection-Algorithmen wissen? [geschlossen]

11

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?

Geek
quelle
1
Ja, das sollten sie. Andernfalls besteht die Gefahr, dass Software geschrieben wird, die unter hoher Last kaputt geht.
quant_dev

Antworten:

9

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?

Falke
quelle
7

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.

JohnMcG
quelle
2
Wenn ich die Grundlagen kenne, denen ich zustimmen würde (Dinge zu verstehen macht dich zu einem besseren Programmierer). Das Problem ist, wenn Sie die komplizierten Details kennen und dann use that informationIhren 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.
Martin York
Ich dachte eher in diesem Sinne: Wenn Sie etwas über die StringImplementierung wissen , werden Sie nicht mit +einer Schleife in eine Zeichenfolge verketten .
JohnMcG
4

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.

superM
quelle
1
Ich stimme (2) und der Hälfte von (1) zu (hilft beim Debuggen). In (1) gibt es jedoch Gefahren. Entwerfen Sie Ihren Code so, dass er mit einer bestimmten Implementierung eines GC funktioniert, da er nicht mehr optimal ist, wenn entweder der GC verbessert wird oder Sie zu einer Implementierung mit einem anderen GC-Typ wechseln.
Martin York
@Loki Astari, Sie haben Recht damit, dass es für bestimmte Implementierungen gefährlich ist. Andererseits gibt es Dinge, die sich (zumindest für eine lange Zeit) nicht ändern, zum Beispiel die Garbage Collection-Prinzipien von .NET.
SuperM
@superM: Tatsächlich unterscheidet sich Monos GC erheblich von dem von Microsoft und wird derzeit durch einen völlig anderen ersetzt.
Jörg W Mittag
@superM: Sieht für mich nicht so langsam aus wie eine Java-Entwicklung: en.wikipedia.org/wiki/Java_version_history (es sieht so aus, als gäbe es einmal im Jahr einen neuen Patch oder ein neues Update). Mit einer neuen Version im nächsten Jahr. Das bedeutet nicht, dass GC jedes Mal aktualisiert wird, sondern dass das Potenzial dafür aufgezeigt wird.
Martin York
@Loki Astari, das stimmt. Vieles in der Softwareentwicklung ändert sich rasant und unsere Aufgabe ist es, Schritt zu halten. Außerdem basieren alle Änderungen auf dem, was bereits vorhanden ist, sodass ich innerhalb von 1 oder 2 Versionen keine radikalen Änderungen erwarten würde.
SuperM
4

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 ).

TMN
quelle
3

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.

Michael Kohne
quelle
1

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.

perdian
quelle