Mit ps
oder ähnlichen Tools erhalten Sie nur die Menge an Speicherseiten, die von diesem Prozess zugewiesen wurden. Diese Nummer ist korrekt, aber:
-
spiegelt nicht die tatsächliche Speichermenge wider, die von der Anwendung verwendet wird, sondern nur die dafür reservierte Speichermenge
-
kann irreführend sein, wenn Seiten geteilt werden, zum Beispiel von mehreren Threads oder durch die Verwendung von dynamisch verlinkten Bibliotheken
Wenn Sie wirklich wissen möchten, wie viel Speicher Ihre Anwendung tatsächlich verwendet, müssen Sie sie in einem Profiler ausführen. Beispielsweise kann Valgrind Ihnen Einblicke in die Menge des verwendeten Speichers geben und, was noch wichtiger ist, über mögliche Speicherlecks in Ihrem Programm. Das Heap-Profiler-Tool von Valgrind heißt 'massiv':
Massif ist ein Heap-Profiler. Es führt ein detailliertes Heap-Profiling durch, indem es regelmäßige Snapshots des Heaps eines Programms erstellt. Es erstellt ein Diagramm, das die Heap-Nutzung im Laufe der Zeit zeigt, einschließlich Informationen darüber, welche Teile des Programms für die meisten Speicherzuweisungen verantwortlich sind. Das Diagramm wird durch eine Text- oder HTML-Datei ergänzt, die weitere Informationen enthält, um festzustellen, wo der meiste Speicher zugewiesen wird. Massif führt Programme etwa 20-mal langsamer als normal aus.
Wie in der Valgrind-Dokumentation erklärt, müssen Sie das Programm über Valgrind ausführen:
valgrind --tool=massif <executable> <arguments>
Massif schreibt einen Dump von Momentaufnahmen der Speichernutzung (z. B. massif.out.12345
). Diese bieten (1) eine Zeitleiste der Speichernutzung, (2) für jeden Snapshot eine Aufzeichnung darüber, wo in Ihrem Programm Speicher zugewiesen wurde. Ein großartiges grafisches Tool zum Analysieren dieser Dateien ist Massif-Visualizer. Aber ich habe ms_print
gefunden , ein einfaches textbasiertes Tool, das mit Valgrind geliefert wird, bereits jetzt eine große Hilfe sein.
Um Speicherlecks zu finden, verwenden Sie den (Standard) memcheck
Werkzeug von Valgrind.
Versuchen Sie es mit dem pmap-Befehl:
sudo pmap -x <process pid>