virtuellen v. physischen Speicher in der Beurteilung von C/C++ memory leak
Ich habe eine C++ - Anwendung, die ich versuche zu Eisen in die Speicher-Lecks aus und ich erkannte, dass ich nicht vollständig verstehen den Unterschied zwischen virtuellen und physikalischen Speicher.
Ergebnisse aus top
(also 16.8 g = virtuelle, 111m = physikalischen):
4406 um 20 0 16.8g 111m 4928 S 64.7 22.8 36:53.65 client
Mein Prozess hält 500 Anschlüsse, einer für jeden Benutzer, und diese zahlen es bedeutet, es ist über 30 MB virtuellen overhead für jeden Benutzer. Ohne in die details meiner Anwendung, der einzige Weg, wie es klingen könnte, aus der Ferne realistisch, die addition aller Vektoren, Strukturen, threads, Funktionen auf dem stack, etc., ist, wenn ich keine Ahnung habe, was der virtuelle Speicher eigentlich bedeutet. No-O-Optimierungs-flags, btw.
Also meine Fragen sind:
- welche Operationen in C++ würde aufblasen virtuellen Speicher, so viel?
- Ist es ein problem, wenn meine Aufgabe ist es, mit Auftritten des virtuellen Speichers?
- Der stack-und heap-Funktion Variablen, Vektoren, etc. - diese unbedingt erhöhen, die Nutzung des physischen Speichers?
- Würde das entfernen eines memory leak (via
delete
oderfree()
oder so) unbedingt reduzieren beide physischen und virtuellen Speicher-Auslastung?
- Haben Sie versucht, mit einem memory-profiler wie valgrind? Mit top-überprüfen der Dichtheit ist nicht ideal.
- Mein Kollege riet mir, dass valgrind wurde sehr sinnlos angesichts der Bibliotheken, die wir verwenden (ich brauche, um zu untersuchen, diese mich immer noch... es ist auf der to-do -). Jetzt bin ich versucht, zu verstehen, die tatsächlichen zahlen, die ich versuche zu bekommen down und arbeiten an der source-Analyse-Ebene - wenn dies wird fruchtlosem ich werde Ihnen tools in.
- Ohne Optimierung = Ihre Daten ist irrelevant.
- zu meinem Verständnis -O1 und -O2-Optimierung für Geschwindigkeit und erhöhen task Größe. Also wenn ich durch den task Größe Probleme mit Ihnen aus-es kann nur noch schlimmer werden mit Ihnen auf.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Virtuellen Speicher ist es, was Ihr Programm befasst sich mit. Es besteht aus allen zurückgegebenen Adressen von
malloc
,new
, et al. Jeder Prozess hat seinen eigenen virtuellen Adressraum. Virtuelle-Adresse-Nutzung ist theoretisch begrenzt durch die Adresse die Größe des Programms: 32-bit-Programme 4GB Adressraum; 64-bit-Programme haben wesentlich mehr. Praktisch gesprochen, ist der Betrag des virtuellen Speichers, dass ein Prozess zuweisen kann, ist weniger als diese Grenzen.Physischen Speicher sind die chips verlötet auf dem motherboard, oder installiert in Ihren Speicher-slots. Die Menge an physischen Speicher, der zu jeder gegebenen Zeit beschränkt sich auf die Menge des physischen Speichers in Ihrem computer.
Den virtual-memory-subsystem Karten, virtuellen Adressen, die Ihr Programm verwendet zu physischen Adressen, die die CPU schickt der RAM-chips. Zu einem bestimmten Zeitpunkt, die meisten von Ihnen zugeteilten virtuellen Adressen werden aufgehoben; somit physikalischen Speicher verwenden, der niedriger ist als virtuellen Speicher zu verwenden. Wenn Sie den Zugriff auf eine virtuelle Adresse, die zugewiesen wird, aber nicht zugeordnet ist, wird das Betriebssystem unsichtbar ordnet physischen Speicher und Karten, die es in. Wenn Sie keinen Zugriff auf eine virtuelle Adresse, das Betriebssystem möglicherweise Abkoppeln des physikalischen Speichers.
Nehmen Ihre Fragen wiederum:
new
,malloc
statische Zuordnung von großen arrays. In der Regel alles, was benötigt Speicher im Programm.Es hängt von der Nutzung Muster Ihrer Programm. Wenn Sie reservieren weiten Strecken der Erinnerung, die Sie nie, nie berühren, und wenn Ihr Programm eine 64-bit-Programm ist, kann es okay sein, dass Sie mit Auftritten des virtuellen Speichers.
Auch, wenn Sie Ihre memory-Nutzung wächst ohne Grenze, Sie wird schließlich Auslaufen einiger Ressourcen.
Nicht unbedingt, aber wahrscheinlich. Der Akt des Berührens einer Variablen sorgt dafür, dass, zumindest für den Augenblick, es (und alle Speicher "in der Nähe" es) ist im physikalischen Speicher. (Beiseite: Container wie
std::vector
zugewiesen werden können, die entweder auf stack oder heap, aber die enthalten Objekte sind dem heap zugeordnet.)Körperliche: wahrscheinlich. Virtual: ja.
Virtuellen Speicher wird der Adressraum von dem Prozess verwendet wird. Jeder Prozess hat einen vollen Blick auf die 64 bit (oder 32, je nach Architektur) adressierbaren bytes ein Zeiger, aber nicht jedes byte Karten, um etwas echtes. Das Betriebssystem verwaltet die Tabelle, die Karten der virtuellen Adresse zur realen physischen Speicher-Seiten -- oder was auch immer, dass die Adresse richtig ist (egal, es scheint zu sein, den Speicher für Ihre Anwendung). Zum Beispiel für Ihre Anwendung ist eine Adresse auf eine Funktion, aber in Wirklichkeit ist es wurde noch nicht von Platte geladen, und wenn Sie es nennen, es erzeugt einen Seitenfehler Unterbrechung, dass der kernel behandelt durch laden der entsprechenden Abschnitt aus der ausführbaren Datei und das mapping zu den Adressraum der Anwendung, damit es ausgeführt werden kann.
Aus Linux-Sicht (und ich glaube, die meisten modernen Betriebssysteme):
mmap
ing-Dateien wird nur erhöhen, den virtuellen Speicher-Auslastung, dies umfasst die Größe der ausführbaren Dateien: je größer Sie sind, desto mehr virtuellen Speicher verwendet.Können Sie die folgenden Umgebungsvariablen zum Steuern der interne Speicher Zuweisungen von malloc. Nach der Einstellung, wird es Antwort auf alle vier Fragen. Wenn Sie wissen möchten, andere Optionen entnehmen Sie bitte :
http://man7.org/linux/man-pages/man3/mallopt.3.html
export MALLOC_MMAP_THRESHOLD_=8192
export MALLOC_ARENA_MAX=4