Wie wichtig ist es, Speicherlecks zu beheben?

19

Ich fand durch Valgring, dass einige GTK + -Programme Speicher verlieren. Wie wichtig ist es, diese Undichtigkeiten zu beheben? Ich meine, oft funktionieren diese Programme sehr gut, aber andererseits kann man nie sicher sein, ob man einen Teil des leckenden Codes in ein anderes Programm kopieren möchte. Und ich bin mir nicht sicher, ob die Idee von GTK + -Programmen ist, schnell zu arbeiten, und daher gibt es Lecks.

Also, wenn ich manchmal ein Speicherleck in einem Open-Source-Programm finde, sollte ich es beheben oder gibt es zum Beispiel Effizienzprobleme und daher bestand die ursprüngliche Idee des Programmierers darin, einen kleinen undichten Code zu schreiben?

Jaakko Seppälä
quelle
17
Speicherlecks sind immer unerwünscht. Sie stellen Ressourcen dar, die das gesamte System nicht nutzen kann, einschließlich des Host-Programms, bis das Programm beendet wird.
recursion.ninja
Es gibt genügend Tools / Bibliotheken, die sich mit der Verfolgung von Speicherlecks befassen. Die Mühe lohnt sich, da die API-Nutzung auf Ihrer Seite möglicherweise falsch ist.
Joop Eggen
1
Als Randnotiz - Valgrind ist großartig, kann aber einige falsche Positive melden (ich habe sie in GObject gesehen).
Maciej Piechotka
Die Berechnung hängt von der Verarbeitung und dem Arbeitsspeicher ab: Ersterer ist der Code und letzterer der Speicherplatz, auf dem er ausgeführt wird. Wenn Sie nicht sicher sind, dass Sie Ihren eigenen Raum nicht in den Papierkorb werfen, wie können Sie ihn möglicherweise für etwas Nützliches verwenden?
Imallett
1
"Kodieren Sie immer so, als ob die Person, die Ihren Kodex am Ende verwaltet, ein gewalttätiger Psychopath ist, der weiß, wo Sie leben."
Jesse C. Slicer

Antworten:

6

Wie wichtig es ist, Speicherlecks zu beheben, hängt von der Schwere des Problems ab und was Sie sonst noch tun müssen, ist wichtig. Ich habe die Erfahrung gemacht, dass kleine Speicherlecks für die meisten Anwendungen eher harmlos sind. Die Lebensdauer einer Desktop-App-Sitzung ist normalerweise nicht lang genug, um eine Beeinträchtigung aufgrund eines kleinen Speicherverlusts festzustellen.

Wenn Sie einen Server schreiben, der rund um die Uhr läuft, können sich mit der Zeit kleine Speicherverluste summieren und zu einem großen Problem werden. Aus diesem Grund planen viele Unternehmen einen täglichen oder wöchentlichen Neustart ihrer Server. Der Aufwand zum Auffinden von Speicherlecks ist im Verhältnis zu dem, was möglicherweise erzielt wird, oft sehr hoch. Daher ist es einfacher, die Server regelmäßig neu zu starten und sich wichtigeren Dingen zuzuwenden.

Mohair
quelle
2
Ich habe noch nie in einer Firma gearbeitet, deren Server wöchentlich neu gestartet wurde ... noch weniger täglich. Ich bin damit einverstanden, dass die Kosten für die Behebung des Lecks zu hoch sein könnten, aber diese Einstellung ist nicht gut IMO
Rémi
@ Rémi Die meisten, wenn nicht alle MMO-Spieleserver, normalerweise wöchentlich.
Sjoerd
35

Bei kurz laufenden Programmen sind Speicherlecks nicht so wichtig. Das Betriebssystem fordert beim Beenden alles zurück, kann jedoch dazu führen, dass andere Ressourcen nicht freigegeben werden.

Unabhängig davon, wie kurz ein Leck ist, kann es innerhalb weniger Stunden außer Kontrolle geraten oder sich unbemerkt über Wochen stapeln.

Mein Rat ist, einen Fehler im Tracker mit einem vorgeschlagenen Fix zu melden, wenn es den Lead interessiert, wird er ihn reparieren.

Die Art des Lecks ist ebenfalls wichtig. Es ist möglich, dass es sich bei der Zuordnung um eine einmalige Zuordnung handelt, bei der sich der Entwickler bei der Bereinigung bewusst auf das Betriebssystem verlassen hat. Diese geben bei Valgrind ein falsches positives Ergebnis.

Ratschenfreak
quelle
4
Ich stimme größtenteils zu. Ich schlage jedoch vor, Sie betonen die Bedeutung eines Speicherlecks. Speicherlecks sind nicht leicht zu nehmen und können einige interessante "Funktionen" Ihrer Anwendung verursachen.
Vladimir Kocjancic
@VladimirKocjancic: +1 für "Feature"
Emilio Garavaglia
1
Ich möchte nur darauf hinweisen, dass ein Computer in der Lage ist, diese millionenfache Verarbeitung ziemlich schnell durchzuführen. Vergiss das nie. Wenn Sie das berücksichtigen, bin ich mit dieser Antwort einverstanden, weil es wirklich vom Programm abhängt. Bei einem eingebetteten System, das ohne menschliches Eingreifen ausgeführt werden soll, sind Speicherverluste tödlich. Für eine "grep" -Implementierung könnten Sie sich wahrscheinlich nicht weniger interessieren.
Dunk
2
@Dunk: Es kommt darauf an: Wenn Sie grepdurch eine sehr große Datei und Ihr Programm ein paar Bytes für jede Eingabezeile verlieren , könnte Ihnen der Speicher ausgehen.
Giorgio
0

Nach meiner zugegebenermaßen dogmatischen Meinung zu diesem Thema gibt es keine Entschuldigung für physische Lecks, zumindest in keiner Bibliothek, die eine breite Anwendbarkeit anstrebt. Daher würde ich versuchen, die GTK + -Entwickler so lange zu nerven, bis sie es selbst reparieren.

Es ist für eine Bibliothek trivial genug, atexitRückrufe zu registrieren , um jeden zugewiesenen Speicherplatz freizugeben, zumindest beim Entladen. Wenn es die Kosten einer Schiffsladung von Teeny-Zuweisungen vermeiden will, sollte es sie nicht an erster Stelle tun.

Sogar das faulste Programm, das nur eine Schiffsladung von winzigen Speicherblöcken gleichzeitig zuweisen möchte, könnte einen einfachen sequenziellen Allokator verwenden, der nur den gesamten Speicher beim Herunterfahren löscht. Wenn der Allokator sich nicht einmal mit der Ausrichtung befassen möchte, kann er einfach jeden einzelnen Block, den er bündelt, auf maximale Ausrichtungsgrenzen auffüllen. Wenn es in der Lage war, von kürzeren Abschaltzeiten zu profitieren, indem es nicht alle diese winzigen Speicherabschnitte einzeln freigab, dann kann es im Austausch für trivialen Aufwand auch sehr viel symmetrischer profitieren, wenn ein solcher sequentieller Allokator verwendet wird, der den Speicher direkt sequentiell mit zusammenfasst viel schneller Allokationen alsmallocund cachefreundlichere Speichermuster, damit alle großen Blöcke zusammenhängenden Speichers, die vom Zuweiser gepoolt wurden, freigegeben werden, wenn die Bibliothek fertig ist. Die Bibliothek muss dann lediglich die mallocAufrufe ersetzen, für die sie sich nicht um freeetwas kümmern seq_malloc, und seq_purgeeinen atexitRückruf anfordern, um den gesamten beim Entladen zugewiesenen Speicherplatz freizugeben.

Andernfalls wird diese fiese Bibliothek Nachrichten in Ihren Tools zur Speicherleckerkennung überladen, die Sie jetzt herausfiltern müssen. Schlimmer noch, wenn Sie sie nicht systematisch herausfiltern, können sie die Lecks in Ihrer eigenen Anwendung verschleiern und Ihre Kollegen könnten die Angewohnheit entwickeln, sie zu übersehen, was die Nützlichkeit der Lecksuchwerkzeuge in erster Linie mindert, um Ihr eigenes Team daran zu hindern Leaky Code drücken. Es ist eklig und hässlich, und vor allem finde ich die Argumente dafür nicht überzeugend, wenn man bedenkt, wie trivial es ist, die obige Lösung zu verwenden.

Logische Lecks (die komplexere Art, gegen die selbst die Garbage Collection keinen Schutz bietet) sind komplexer, und ich könnte eine Rechtfertigung dafür finden, dass kurzlebige Programme logische Lecks aufweisen, solange sie den gesamten zugewiesenen Speicher löschen Herunterfahren, da viel über Ressourcenverwaltung nachgedacht werden muss, um logische Lecks zu vermeiden (wohl eher in Sprachen mit GC). Aber ich finde keine vernünftige Entschuldigung, um physische Lecks zu vermeiden, wenn man bedenkt, wie trivial sie auch in den trägsten Kontexten zu vermeiden sind.

Jedenfalls würde ich zumindest die Lecks in Valgrind herausfiltern, damit sie zumindest nicht die Fähigkeit Ihres Teams beeinträchtigen, Ihre eigenen zu erkennen.


quelle
1
Ich frage mich, ob Lecks irgendetwas mit "Bootscodierung" zu tun haben.
0

FWIW, wenn ein Benutzer ein Leck in einer Anwendung, an der ich arbeite, meldet, bin ich sehr geneigt, es zu beheben (insbesondere, wenn sie Code für die Fehlerbehebung in den Fehlerbericht aufgenommen haben!). Das heißt, es kann nicht sofort passieren, wenn das Leck klein ist und andere Probleme dringender sind (z. B. ein häufig auftretender Absturzfehler). Aber ich würde es definitiv begrüßen und daran arbeiten, es irgendwann zu beheben. Sie sollten sie auf jeden Fall wissen lassen. Sie werden es entweder zu schätzen wissen und daran arbeiten (höchstwahrscheinlich), oder es ist ihnen egal, und alles, was es Sie gekostet hat, ist etwas Zeit.

user1118321
quelle