Помогите улучшить мое личное решение для высокого использования памяти Safari, или скажите, почему это плохо - PullRequest
5 голосов
/ 26 августа 2011

Хорошо.Я был отчасти раздражен, потому что я запускаю Mac OS Lion на i7 MPB с 8 ГБ ОЗУ, и Safari всегда снижает производительность во времени.

Следовательно, я заметил, что не только Safari.app потребляетненормальный объем памяти, но также и его пара под названием «Safari Web Content» (который потребляет даже больше).

Раздраженный этим, я решил убить экземпляры «Safari Web Contant» (они всегда появляются парами,Любопытно. Но, как бы там ни было) В конце концов, Safari.app - главное приложение.Что случилось?Знаете ли вы, когда все ваши вкладки в Safari обновляются автоматически?Происходит тот же эффект: использование памяти Safari Web Content прекращается (когда оно завершается, а затем перезапускается с нуля), и все ваши вкладки обновляются при выборе.Это заставляет меня поверить, что автоматическое обновление этих вкладок, которое иногда происходит, является не чем иным, как способом освобождения памяти очень странным образом (то, что на португальском языке называется «чунчо»).

Хорошо, такчто?Ну, если это кажется (по крайней мере для меня) «официальным» способом лучше справляться с потреблением памяти, я думаю, было бы хорошо, если бы я сделал то же самое, верно?

Поэтому я создал небольшойСценарий, который запускается каждую минуту как задание crontab, проверяет, не слишком ли велико использование памяти «Safari Web Content» и, если это так, убивает ее.

Вот оно:

#!/bin/bash

filename=".tt_0e92309ei2390i209ei9203"
LIMIT=6

ps -eo pmem,pid,args | grep WebProcess.app | grep -v grep | cut -d"/" -f1 > $filename

while read line
do
  mem=`echo "${line}"| awk '{print $1}'`
  mem=$(echo $mem | sed -e 's/,/./g')
  pid=`echo "${line}"| awk '{print $2}'`

  status=$(echo "$mem > $LIMIT" | bc -l)

  if [ "$status" -eq "1" ]
  then
    kill $pid
  fi

done < $filename

rm $filename

Не обращайте внимания на случайное имя файла и странные вещи («чанчо»), которые я, возможно, сделал: P Этот сценарий в основном проверяет, существует ли какой-либо процесс «Safari Web Content», потребляющий больше, чем процент $ LIMIT моей памяти.Поскольку у меня есть 8 ГБ оперативной памяти, я, хотя 6%, было бы уже слишком много (обратите внимание, что раньше ему иногда удавалось преодолеть эти 6%), поэтому процесс должен быть убит!Эта проверка выполняется каждую 1 минуту через выполнение этого скрипта на моем crontab.

Результаты? Производительность Safari теперь намного лучше!:) Мне не нужно вручную переустанавливать Safari раз в полтора часа, и это меня очень радует :) (хотя на фоне происходит почти то же самое)

Побочные эффекты? Weeell.Обновление вкладок - не всегда то, что нужно.Есть один явный побочный эффект, о котором я могу думать.Если ваш процесс «Safari Web Content» закроется, когда вы выполняете какую-то важную операцию, вы потеряете все.Например, если мое потребление памяти слишком велико, когда я опрокидываю это, и сценарий убил мой процесс контента, я бы потерял все.

С удовольствием, я использовал сценарий уже несколько дней, и до сих порничего не потерял.

Несмотря на то, что это решение дало мне лучший опыт при просмотре до настоящего момента, и я все еще не раздражался из-за потери некоторых записей, я знаю, что это возможно.Поэтому я хотел бы знать, знаете ли вы, ребята, как освободить определенную область памяти процесса.

Я спрашиваю об этом, потому что, когда я запускаю vmmap на pid «Safari Web Content», я замечаю, чтоБольшая часть используемой памяти выделяется в зоне Malloc «JavaScriptCore FastMalloc_0xaca89d40».Таким образом, я предполагал, что, если бы я мог освободить эту память, я мог бы получить лучший опыт в Safari без риска потерять слишком много (конечно, это будет зависеть от того, как Safari справится с этим тонким неожиданным освобождением памяти, ноЯ верю).

Давай доберемся до конца .Считаете ли вы, что мой подход хорош, или вы можете подумать о других побочных эффектах от того, что я делаю?Кроме того, вы знаете, могу ли я очистить память об этом конкретном регионе?Я не против, если мне понадобится root-доступ (по крайней мере, для тестирования). И, наконец, разработали ли вы свой собственный способ повышения удобства просмотра при использовании Safari?Если это так, пожалуйста, поделитесь!:)

Фернандо.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2011

Я сделал что-то похожее, только с applecriptcript:

if appIsRunning("Safari") then
    tell application "Safari"
      quit
    end tell
    delay 5
end if

tell application "Safari"
    activate
end tell

on appIsRunning(appName)
    tell application "System Events" to (name of processes) contains appName
end appIsRunning

Затем я установил работу cron для запуска каждое утро в 3 часа ночи. Я, кажется, не страдаю слишком много раздувания в течение дня. Только после нескольких дней работы мой процесс «Safari Web Content» начинает потреблять 2+ гигабайта памяти.

1 3 * * * /usr/bin/osascript /path/to/restart-safari.scpt
0 голосов
/ 26 августа 2011

Нет, вы не можете заставить другой процесс освободить память.В любом случае, это почти наверняка приведет к краху (что фактически делает то, что вы делаете, убивая процесс веб-контента Safari).

...