2010-11-19 22 views
4

Ein Systemadministrator sagte Med, dass Speicherlecks unsichtbar sein können. d. h. der gesamte Speicher, der von einer Anwendung verwendet wird, ist möglicherweise im Task-Manager oder einem ähnlichen Tool nicht sichtbar, wenn die Anwendung Speicher verliert.Versteckte Speicherlecks

Er schien sehr sicher davon. Ich habe immer, dass alle Speicherlecks korrekt angezeigt werden (nicht in Bytes, aber dass der Speicher ständig zunimmt, bis es keinen Speicher mehr im Server gibt) in Tools wie dem Task-Manager (oder Prozess-Explorer)?

Ist seine Aussage richtig und wenn ja: Welche Arten von Programmen können auf diese Weise Speicher verlieren?

bearbeitet:

Ich spreche nicht über ein bestimmtes Leck zu sehen, aber dass der Prozess mehr und mehr Speicher verbraucht. Laut ihm wird der Prozess nicht mehr Speicher für bestimmte Speicherlecks verbrauchen.

Antwort

4

Ein Speicherleck ist eine Situation, wenn ein Speicherblock als belegt im Programmspeicher vorhanden ist, und es gibt in diesem Programm keine Zeigervariable markiert Speichern der Adresse wenn dieser Block. Task-Manager und ähnliche Dienstprogramme zeigen das Gesamtvolumen des belegten Speichers (plus Overhead und Fragmentierung) an, und sie haben keine Ahnung von Zeigern - sie können den Programmspeicher nicht untersuchen.

Dies ist der Grund, warum ausgelaufener Speicher und nur belegter Speicher, in dem das Programm Zeiger speichert, für solche Dienstprogramme nicht zu unterscheiden sind. Es ist also unmöglich, Speicher "still" zu hinterlassen - auf verdeckte Weise, so dass der Speicherverbrauch des Programms nicht zunimmt.

+1

Sie können ein Tool verwenden, um Speicherlecks zu finden - deleaker. Coole App! – MastAvalons

+0

Ich habe +1 vergessen, als ich die Antwort angenommen habe. Du hast es jetzt. 6 Jahre zu spät ist besser als nie, oder? – jgauffin

+0

@jgaufin Upvotes sind nie zu spät. – sharptooth

0

Zunächst hängt es davon ab, wie Sie Speicherleck definieren. Ich würde normalerweise jeden Fall in Betracht ziehen, in dem Speicher zugewiesen wurde, aber keine Zeiger/Referenzen verbleiben, um ein Speicherleck zu sein, nicht nur dann, wenn eine Anwendung ständig Speicher zuweist, ohne sie freizugeben. (und wahrscheinlich eine andere Definition, wenn GC beteiligt ist)

Mit dieser Definition nein ist es nicht möglich, alle Speicherlecks über den Task-Manager zu sehen, da der Prozess möglicherweise nicht den gesamten Speicher an das Betriebssystem zurückgibt Es wird vom Programm freigegeben, so dass Sie nicht jede positive oder negative Änderung der Speicherbelegung sehen müssen.

Das heißt jeder Prozess, der Speicher constanly sicher ist verschlang sieht verdächtig

0

Je nach Compile-Konstruktion ist es möglich, dass der Speicher erst beim ersten Zugriff zugewiesen wird. So zum Beispiel das Skript:

while(malloc(50)); 

könnte sagen, ein Speicherleck zu verursachen - wie es hält nur Speicher zuweisen, bis alles genommen wird. Wenn jedoch der Speicher nicht wirklich zugewiesen wird, bis er verwendet wird, dann wäre dies ein "unsichtbares Leck" - obwohl ich zugeben muss, dass es die Definition von leak erweitert;).

+0

Wenn es nicht zugewiesen ist, ist es auch kein Speicherleck. Nicht belegt = kein Speicher. – jgauffin