Wie andere richtig ausgeführt haben, ist es schwierig, einen Überblick über den von einem Prozess tatsächlich verwendeten Speicher zu bekommen, was mit gemeinsam genutzten Bereichen und mit MMAP-Dateien und so weiter.
Wenn Sie ein Experimentator sind, können Sie Valgrind und Massif ausführen . Dies kann für den Gelegenheitsbenutzer etwas schwierig werden, aber Sie erhalten eine Vorstellung vom Speicherverhalten einer Anwendung im Laufe der Zeit. Wenn eine Anwendung malloc () genau das ist, was sie benötigt, erhalten Sie eine gute Darstellung der tatsächlichen dynamischen Speichernutzung eines Prozesses. Aber dieses Experiment kann "vergiftet" werden.
Um die Sache zu verkomplizieren, können Sie unter Linux Ihren Speicher überbelegen . Wenn Sie Speicher malloc (), erklären Sie Ihre Absicht, Speicher zu verbrauchen. Die Zuweisung erfolgt jedoch erst dann, wenn Sie ein Byte in eine neue Seite Ihres zugewiesenen "RAM" schreiben. Sie können sich das selbst beweisen, indem Sie ein kleines C-Programm wie das folgende schreiben und ausführen:
// test.c
#include <malloc.h>
#include <stdio.h>
#include <unistd.h>
int main() {
void *p;
sleep(5)
p = malloc(16ULL*1024*1024*1024);
printf("p = %p\n", p);
sleep(30);
return 0;
}
# Shell:
cc test.c -o test && ./test &
top -p $!
Führen Sie dies auf einem Computer mit weniger als 16 GB RAM aus, und Sie haben gerade 16 GB Arbeitsspeicher erzielt! (Nein nicht wirklich).
Beachten top
Sie, dass "VIRT" als 16.004G angezeigt wird,% MEM jedoch 0.0 ist
Führen Sie dies mit valgrind erneut aus:
# Shell:
valgrind --tool=massif ./test &
sleep 36
ms_print massif.out.$! | head -n 30
Und das Massiv sagt "Summe aller Zuordnungen () = 16 GB". Das ist also nicht sehr interessant.
ABER, wenn Sie es auf einem vernünftigen Prozess ausführen :
# Shell:
rm test test.o
valgrind --tool=massif cc test.c -o test &
sleep 3
ms_print massif.out.$! | head -n 30
--------------------------------------------------------------------------------
Command: cc test.c -o test
Massif arguments: (none)
ms_print arguments: massif.out.23988
--------------------------------------------------------------------------------
KB
77.33^ :
| #:
| :@::@:#:
| :::::@@::@:#:
| @:: :::@@::@:#:
| ::::@:: :::@@::@:#:
| ::@:::@:::::@:: :::@@::@:#:
| @::@:::@:::::@:: :::@@::@:#:
| @::@:::@:::::@:: :::@@::@:#:
| :@@@@@@@@@@@@@@@@@@@@:@::@:::@:::::@:: :::@@::@:#:
| :@@ :@::@:::@:::::@:: :::@@::@:#:
| :@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :::::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| ::::::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| ::::::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
0 +----------------------------------------------------------------------->Mi
0 1.140
Und hier sehen wir (sehr empirisch und mit sehr hohem Vertrauen), dass der Compiler 77 KB Heap zugeteilt hat.
Warum versuchen Sie so hart, nur Heap-Nutzung zu bekommen? Da alle gemeinsam genutzten Objekte und Textabschnitte, die ein Prozess verwendet (in diesem Beispiel der Compiler), nicht besonders interessant sind. Sie sind ein ständiger Aufwand für einen Prozess. In der Tat sind nachfolgende Aufrufe des Prozesses fast "kostenlos".
Vergleichen und kontrastieren Sie auch Folgendes:
MMAP () eine 1 GB-Datei. Ihre VMSize beträgt 1 + GB. Die Größe der residenten Gruppe besteht jedoch nur aus den Teilen der Datei, in denen Sie eine Auslagerung verursacht haben (indem Sie einen Zeiger auf diesen Bereich dereferenzieren). Und wenn Sie die gesamte Datei "lesen", hat der Kernel bis zum Ende möglicherweise bereits die Anfänge ausgelagert (dies ist einfach, da der Kernel genau weiß, wie / wo diese Seiten zu ersetzen sind, wenn sie erneut dereferenziert werden ). In beiden Fällen sind weder VMSize noch RSS ein guter Indikator für die "Speichernutzung". Sie haben tatsächlich nichts malloc () 'ed.
Im Gegensatz dazu Malloc () und berühren Sie VIELEN Speicher - bis Ihr Speicher auf die Festplatte ausgelagert wird. Der zugewiesene Speicher überschreitet jetzt Ihren RSS-Wert. Hier könnte Ihr VMSize Ihnen etwas mitteilen (Ihr Prozess verfügt über mehr Speicher, als sich tatsächlich in Ihrem RAM befindet). Es ist jedoch immer noch schwierig, zwischen freigegebenen VM-Seiten und vertauschten VM-Daten zu unterscheiden.
Hier wird Valgrind / Massif interessant. Es zeigt Ihnen, was Sie absichtlich zugewiesen haben (unabhängig vom Status Ihrer Seiten).
htop
Autors auf eine ähnliche Frage teilen, die ich neulich