Как вы записываете, сколько памяти приложение использует в OS X

528
Josiah

Я на Mac Mini с OS X 10.8.2. Я разработчик приложений, но в этом случае я создаю приложение на C ++, поэтому я не могу использовать Xcode для этого вопроса. Я хотел бы отследить, сколько памяти использует мое приложение, но я не хочу записывать его вручную. Как мне это сделать.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Я хочу записывать это весь день. Приложение будет работать весь день, чтобы я мог сравнивать пики в памяти. Я не против сторонних приложений, если они надежны. Благодарю.

0
Не совсем программист, но может быть [Valgrind] (http://valgrind.org/info/tools.html)? slhck 11 лет назад 0
Вы можете использовать приложение Instruments, подключившись к любому процессу без запуска самого Xcode. Ken 11 лет назад 0
Я видел это. Однако я не видел способа «вернуться во времени» и просматривать воспоминания в течение дня. Если бы вы могли объяснить, как использовать / читать это. Это было бы хорошо. Josiah 11 лет назад 0

1 ответ на вопрос

3
terdon

Вы должны быть в состоянии сделать это, используя стандартную psкоманду. От 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.  

Единственное, что вам нужно, это PID вашего процесса. Итак, если ваше приложение называется myApp, вы можете получить PID следующим образом:

ps x | grep myApp 

Который печатает список как это:

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

Первый столбец - это идентификатор процесса (PID). Теперь, если вы хотите автоматизировать это, вам нужно пропустить строку, содержащую команду grep, и сохранить вывод в переменной BASH:

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

awkЧасть делает команду печати только первое поле, то PID.


Вы можете объединить все это в один слой, который каждую минуту будет экономить использование памяти вашего приложения, в файл с именем 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 заставляет bash работать в бесконечном цикле, ожидая 60 сек между циклами
  • sleep 60говорит ему подождать 60 секунд. Измените это значение, если оно требуется для более частого обновления.

В результате получается файл ( memlog.txt) с 4 столбцами: PID вашего приложения, размер резидентного набора, размер виртуальной памяти и процент памяти. Например:

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

Это может быть легко расширено, чтобы включить использование процессора и время для каждого измерения. Например, чтобы включить время:

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  
Я получаю сообщение об ошибке в первой строке. Я не думаю, пока (1); до \ правильно. Пожалуйста, исправьте это. Кроме того, если это сработает, я бы предпочел что-то более визуальное. Не похоже, что это должно быть трудно сделать. Josiah 11 лет назад 0
На самом деле я хотел бы что-то вроде Instruments.app, или, возможно, этот точный инструмент. Однако, хотя он и записывает память, он, похоже, не отслеживает память конкретного приложения. Josiah 11 лет назад 0
@AceLegend, `\` `просто сообщает BASH, что команда продолжается в следующей строке, используемой здесь для простоты чтения. Это должно работать, если вы просто копируете, вставляете его напрямую, не будет, если вы копируете его вручную. Все, что в одной строке - это `while (1); do date = $ (дата +% 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; сон 60; done`. Что касается визуального, я бы просто взял значения и построил их. terdon 11 лет назад 0
Я понимаю, но это все еще не работает. Я создал файл со строкой #! / Bin / bash, пропустил строку, затем: `while (1); do date = $ (дата +% 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; сон 60; done` Josiah 11 лет назад 0
Затем я сохранил его как memTesting.sh и использовал `sudo chmod + x`, чтобы сделать его исполняемым. Тогда ./memTesting.sh. Он по-прежнему выдает ошибку о том, что использует неизвестную команду. Josiah 11 лет назад 0
Хорошо, я нашел это, проблема в разнице в BASH между OSX и Linux. Команда, которую я вам дал, прекрасно работает на моем компьютере с Linux, но OSX BASH не любит `while (1)`. Я обновил свой ответ, теперь он должен работать. Я также изменил `gawk` на` awk` на всякий случай. Я не уверен, но я думаю, что `awk` установлен по умолчанию на OSX. Дайте мне знать, если нет. terdon 11 лет назад 0

Похожие вопросы