Wie zeichnet man auf, wie viel Speicher eine App unter OS X belegt?

592
Josiah

Ich bin auf einem Mac Mini mit OS X 10.8.2. Ich bin ein App-Entwickler, aber in diesem Fall baue ich eine App in C ++, daher kann ich Xcode für diese Frage nicht verwenden. Ich möchte nachverfolgen, wie viel Speicher meine App verwendet, aber ich möchte sie nicht manuell aufzeichnen. Wie mache ich das.

MEHR INFO: Ich möchte den ganzen Tag aufnehmen. Ich werde die App den ganzen Tag laufen lassen, damit ich die Speicherinhalte vergleichen kann. Ich bin nicht gegen Apps von Drittanbietern, solange sie zuverlässig sind. Vielen Dank.

0
Nicht wirklich ein Programmierer, aber vielleicht [Valgrind] (http://valgrind.org/info/tools.html)? slhck vor 11 Jahren 0
Sie können die Instruments-App verwenden, indem Sie sie an jeden Prozess anhängen, ohne Xcode selbst zu starten. Ken vor 11 Jahren 0
Das habe ich gesehen. Ich habe jedoch keine Möglichkeit gesehen, "zurück in die Zeit zu gehen" und den ganzen Tag über die Erinnerung zu sehen. Wenn Sie erklären könnten, wie man es benutzt / liest? Das wäre schön. Josiah vor 11 Jahren 0

1 Antwort auf die Frage

3
terdon

Dies sollte mit dem Standardbefehl möglich sein ps. Von man ps:

%mem %MEM ratio of the process's resident set size to the physical memory on the machine, expressed as a percentage.   rss RSS resident set size, the non-swapped physical memory that  a task has used (inkiloBytes).   vsz VSZ virtual memory size of the process in KiB (1024byte units). Device mappings are currently excluded; this is subject to change.  

Das einzige andere Detail, das Sie benötigen, ist die PID Ihres Prozesses. Wenn Ihre App myApp heißt, können Sie die PID folgendermaßen erhalten:

ps x | grep myApp 

Welche druckt eine Liste wie folgt:

15909 pts/3 S 0:37 myApp 22583 pts/6 S+ 0:00 grep --color myApp 

Die erste Spalte ist die Prozess-ID (PID). Wenn Sie dies nun automatisieren möchten, müssen Sie die Zeile mit dem Befehl grep überspringen und die Ausgabe in einer BASH-Variablen speichern:

pid=$(ps x | grep myApp | grep -v grep | awk '') 

Das awkTeil lässt den Befehl nur das 1. Feld, die PID, drucken.


Sie können all dies in einem One-Liner zusammenfassen, der den Speicherplatz Ihrer App jede Minute in einer Datei speichert, die als memlog.txt:

while sleep 60; do \ pid=$(ps x | grep myApp | grep -v grep | awk '') && \ ps xo pid,rss,vsz,%mem | grep "$pid" >> memlog.txt ; \ done  
  • while sleep 60 Bewirkt, dass bash in einer Endlosschleife ausgeführt wird und 60 Sekunden zwischen den Schleifen wartet
  • sleep 60sagt, es soll 60 Sekunden warten. Ändern Sie diesen Wert, wenn Sie ihn häufiger aktualisieren möchten.

Die resultierende Ausgabe ist eine Datei ( memlog.txt) mit 4 Spalten: Die PID Ihrer App, die Größe des residenten Satzes, die Größe des virtuellen Speichers und der Speicherprozentsatz. Zum Beispiel:

4166 25240 633028 0.3 4166 25240 633028 0.3 4166 25240 633028 0.3 

Dies kann leicht um die CPU-Nutzung und eine Zeit für jede Messung erweitert werden. Zum Beispiel, um Zeit einzuschließen:

while sleep 60; do \ date=$(date +%D" "%H:%M:%S); echo -n "$date : " >> memlog.txt; pid=$(ps x | grep myApp | grep -v grep | awk '') && \ ps xo pid,rss,vsz,%mem | grep "$pid" >> memlog.txt; \ done  
Ich bekomme einen Fehler in der ersten Zeile. Ich denke nicht (1); do \ ist richtig. Bitte korrigieren Sie das. Wenn dies funktioniert, würde ich etwas mehr visuell bevorzugen. Es scheint nicht so zu sein, dass dies schwierig sein sollte. Josiah vor 11 Jahren 0
Eigentlich hätte ich gerne etwas wie Instruments.app oder vielleicht genau dieses Werkzeug. Obwohl es Speicher aufzeichnet, scheint es den Speicher einer bestimmten Anwendung nicht zu verfolgen. Josiah vor 11 Jahren 0
@AceLegend, das `\` `sagt BASH nur, dass der Befehl in der nächsten Zeile fortgesetzt wird, die hier zum besseren Lesen verwendet wird. Es sollte funktionieren, wenn Sie es einfach kopieren, fügen Sie es direkt ein, nicht aber wenn Sie es von Hand kopieren. Das Ganze in einer Zeile ist `while (1); do Datum = $ (Datum +% D ""% H:% M:% S); echo -n "$ date:" >> memlog.txt; pid = $ (ps x | grep myApp | grep -v grep | gawk '') && ps xo pid, rss, vsz,% mem | grep "$ pid" >> memlog.txt; Schlaf 60; fertig ". Was das visuelle angeht, würde ich einfach die Werte nehmen und sie darstellen. terdon vor 11 Jahren 0
Ich verstehe, aber es funktioniert immer noch nicht. Ich erstellte eine Datei mit der Zeile #! / Bin / bash übersprang eine Zeile und dann: `while (1); do Datum = $ (Datum +% D ""% H:% M:% S); echo -n "$ date:" >> memlog.txt; pid = $ (ps x | grep Nightly | grep -v grep | gawk '') && ps xo pid, rss, vsz,% mem | grep "$ pid" >> memlog.txt; Schlaf 60; fertig " Josiah vor 11 Jahren 0
Ich speicherte es dann als memTesting.sh und benutzte `sudo chmod + x`, um es ausführbar zu machen. Dann ./memTesting.sh. Es wird immer noch eine Fehlermeldung ausgegeben, die besagt, dass ein unbekannter Befehl verwendet wird. Josiah vor 11 Jahren 0
OK, ich habe es gefunden, das Problem ist ein Unterschied zwischen OSX und Linux. Der Befehl, den ich Ihnen gegeben habe, funktioniert gut auf meiner Linux-Box, aber OSX BASH mag `while (1)` nicht. Ich habe meine Antwort aktualisiert, sie sollte jetzt funktionieren. Ich habe auch "Gawk" in "Awk" geändert, nur für den Fall. Ich bin nicht sicher, aber ich denke, dass "awk" standardmäßig unter OSX installiert ist. Lass es mich wissen wenn nicht terdon vor 11 Jahren 0