Ich werde ausgeführt top
, um die Leistung meines Servers zu überwachen, und 2 meiner Java-Prozesse zeigen einen virtuellen Speicher von bis zu 800 MB - 1 GB an. Ist das etwas schlechtes?
Was bedeutet virtueller Speicher?
Und übrigens, ich habe Swap von 1 GB und es zeigt 0% verwendet. Also bin ich verwirrt.
Java-Prozess = 1 Tomcat-Server + mein eigener Java-Daemon-Server = Ubuntu 9.10 (karmic)
linux
virtualization
memory
top
kapso
quelle
quelle
Antworten:
Virtueller Speicher ist nicht unbedingt Speicher. Wenn ein Prozessspeicher beispielsweise eine große Datei abbildet, wird die Datei tatsächlich auf der Festplatte gespeichert, belegt jedoch immer noch den "Adressraum" im Prozess.
Der Adressraum (dh der virtuelle Speicher in der Prozessliste) kostet nichts. Es ist nicht real. Real ist die Spalte RSS (RES), bei der es sich um den residenten Speicher handelt. Das ist die Menge Ihres tatsächlichen Gedächtnisses, die ein Prozess belegt.
Aber auch das ist nicht die ganze Antwort. Wenn ein Prozess fork () aufruft, wird er in zwei Teile geteilt, und beide teilen zunächst alle ihre RSS. Selbst wenn RSS anfangs 1 GB betrug, würde das Ergebnis nach dem Gabeln zwei Prozesse mit jeweils 1 GB RSS sein, aber Sie würden immer noch nur 1 GB Speicher verwenden.
Noch verwirrt? Folgendes müssen Sie unbedingt wissen: Verwenden Sie den
free
Befehl und überprüfen Sie die Ergebnisse vor und nach dem Start Ihres Programms (in der+/- buffers/cache
Zeile). Dieser Unterschied besteht darin, wie viel neuen Speicher Ihr neu gestartetes Programm verwendet.quelle
smem
.java -Xmx16g RunLong
starte, der 16 GB Speicher für den Java-Prozess reserviert, dannVIRT
scheint es, dass die 16 GB gezählt werden. Was ist in diesem Fall der Typ dieses 16-GB-Speichers, ist das zugeordneter Speicher oder ...?Von der oberen (1) Manpage:
Wobei RES RESident Memory (physischer Speicher verwendet) bedeutet.
Eigentlich stimmt das nicht mehr. Wenn "Swap" angezeigt wird, umfasst dies auch Dateien, die das Programm in seinem Adressraum zugeordnet hat und die möglicherweise tatsächlich noch echten RAM verbrauchen oder nicht. Dieser Speicher ist dateigesichert, aber nicht wirklich austauschbar.
VIRT enthält auch Seiten, die zugewiesen, aber noch für nichts verwendet wurden. Jede Seite in diesem Status wird der Kernel-Zero-Page zugeordnet (brillantes Konzept - Sie sollten es nachschlagen), damit sie in VIRT angezeigt wird, aber tatsächlich keinen Speicher verbraucht.
quelle
-m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT
. Schade, dass ich diese Antwort nicht ablehnen kann.Ich fand diese Erklärung von Mugurel Sumanariu sehr klar:
quelle
Die VIRT-Spalte in der Ausgabe von ps / top ist für die Messung der Speichernutzung nahezu irrelevant. Mach dir keine Sorgen. Apache VIRT gegen RES-Speicher
https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used
quelle
Linux unterstützt virtuellen Speicher, d. H. Eine Festplatte als Erweiterung des Arbeitsspeichers, sodass die effektive Größe des nutzbaren Arbeitsspeichers entsprechend zunimmt. Der Kernel schreibt den Inhalt eines derzeit nicht verwendeten Speicherblocks auf die Festplatte, damit der Speicher für einen anderen Zweck verwendet werden kann. Wenn der ursprüngliche Inhalt erneut benötigt wird, wird er in den Speicher zurückgelesen. Dies alles wird für den Benutzer vollständig transparent gemacht; Programme, die unter Linux ausgeführt werden, sehen nur den größeren verfügbaren Speicher und bemerken nicht, dass sich Teile von ihnen von Zeit zu Zeit auf der Festplatte befinden. Das Lesen und Schreiben der Festplatte ist natürlich langsamer (in der Größenordnung von tausendmal langsamer) als die Verwendung von echtem Speicher, sodass die Programme nicht so schnell ausgeführt werden. Der Teil der Festplatte, der als virtueller Speicher verwendet wird, wird als Swap Space bezeichnet.
Linux kann entweder eine normale Datei im Dateisystem oder eine separate Partition für den Auslagerungsspeicher verwenden. Eine Auslagerungspartition ist schneller, es ist jedoch einfacher, die Größe einer Auslagerungsdatei zu ändern (es ist nicht erforderlich, die gesamte Festplatte neu zu partitionieren und möglicherweise alles von Grund auf neu zu installieren). Wenn Sie wissen, wie viel Auslagerungsspeicher Sie benötigen, sollten Sie sich für eine Auslagerungspartition entscheiden. Wenn Sie sich jedoch nicht sicher sind, können Sie zuerst eine Auslagerungsdatei verwenden und das System eine Weile verwenden, damit Sie ein Gefühl dafür bekommen, wie viel Auslagerungsspeicher Sie benötigen müssen, und dann machen Sie eine Swap-Partition, wenn Sie über die Größe sicher sind.
Sie sollten auch wissen, dass Linux es einem erlaubt, mehrere Swap-Partitionen und / oder Swap-Dateien gleichzeitig zu verwenden. Dies bedeutet, dass Sie, wenn Sie nur gelegentlich ungewöhnlich viel Auslagerungsspeicher benötigen, zu diesen Zeiten eine zusätzliche Auslagerungsdatei einrichten können, anstatt die gesamte zugewiesene Menge zu behalten.
Anmerkung zur Betriebssystemterminologie: In der Informatik wird normalerweise zwischen Auslagerung (Auslagerung des gesamten Prozesses) und Paging (Auslagerung von Teilen mit fester Größe, in der Regel jeweils einige Kilobyte) unterschieden. Paging ist normalerweise effizienter, und genau das macht Linux, aber die traditionelle Linux-Terminologie spricht ohnehin vom Tauschen.
Quelle: http://www.faqs.org/docs/linux_admin/x1752.html
quelle
VIRtual
Die obere Spalte bezieht sich auf den Super-Space (Super-Consum-Space) des Prozesses, den der Prozess zur Laufzeit möglicherweise nicht tatsächlich einnimmt. ZurRESident
Laufzeit gibt es eine weitere Spalte , die sich auf den tatsächlich vom Prozess zugewiesenen physischen Speicher bezieht.Der Grund für den Unterschied zwischen den beiden kann anhand des Beispiels verstanden werden: Wenn der Prozess eine bestimmte Bibliothek verwendet, hilft auch die Bibliotheksgröße dem
virtual-size
. da jedoch nur ein Teil der Bibliothek verwendet wird (dh einige Methoden in Gebrauch sind), hilft diesresident-size
.Siehe für Mehr Infos
quelle
"VIRT" ist nur der Adressraum, RES ist der "echte" Speicher, aber die "SHR" (= shared) Menge von "RES" ist der Teil von RES, der mit anderen Prozessen geteilt wird. Daher glaube ich, dass Sie durch Subtrahieren von SHR von RES für die meisten Prozesse die Speicherkapazität erhalten, die diesem bestimmten Prozess tatsächlich zuzuordnen ist.
quelle