2011-08-25 24 views
5

Vâng. Tôi cảm thấy khó chịu vì tôi đang chạy Mac OS Lion trên một i7 MPB với 8GB RAM, và Safari luôn bị giảm hiệu suất trong suốt thời gian đó.Giúp cải thiện giải pháp cá nhân của tôi đối với việc sử dụng bộ nhớ cao của Safari hoặc nói lý do tại sao nó không tốt

Do đó, tôi đã nhận thấy rằng không chỉ Safari.app tiêu thụ một lượng bộ nhớ bất thường, mà còn cặp đôi của nó có tên là "Nội dung web Safari" (tiêu thụ nhiều hơn).

Bực mình vì điều này, tôi quyết định tiêu diệt các trường hợp "Safari Web Contant" (chúng luôn xuất hiện theo cặp, tò mò. Nhưng, bất cứ điều gì), sau khi tất cả, Safari.app là ứng dụng chính, dù sao đi nữa. Chuyện gì đã xảy ra? Bạn có biết khi nào tất cả các tab trong Safari làm mới tự động không? Hiệu ứng tương tự cũng xảy ra: việc sử dụng bộ nhớ của nội dung Web Safari giảm xuống (khi nó thoát, và sau đó được khởi chạy lại từ điểm số không) và tất cả các tab của bạn được làm mới khi chọn. Nó làm cho tôi tin rằng những tab 'tự động làm mới mà đôi khi xảy ra là không có gì hơn là một cách để giải phóng bộ nhớ một cách rất kỳ lạ (những gì sẽ được gọi là "chuncho", bằng tiếng Bồ Đào Nha).

Ok, vậy thì sao? Vâng, nếu có vẻ như (ít nhất là đối với tôi) là cách 'chính thức' để xử lý tốt hơn mức tiêu thụ bộ nhớ, tôi đoán sẽ ổn nếu tôi làm như vậy, đúng không?

Vì vậy, tôi đã tạo một tập lệnh nhỏ chạy mỗi phút làm công việc crontab, kiểm tra xem mức sử dụng bộ nhớ "Safari Web Content" có quá cao không và nếu có, sẽ tiêu diệt nó.

Ở đây là:

#!/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 

Đừng để ý có tên filename ngẫu nhiên, cũng không phải những điều kỳ lạ ("chunchos") Tôi có thể đã thực hiện: P Đó là kịch bản cơ bản kiểm tra nếu có bất kỳ "Safari Web Content "quá trình tiêu thụ nhiều hơn $ LIMIT phần trăm bộ nhớ của tôi. Như tôi có 8GB ram, tôi mặc dù 6% sẽ là quá nhiều (Lưu ý rằng trước đây, đôi khi nó quản lý để vượt qua những 6%), vì vậy quá trình này nên bị giết! Việc xác minh đó được thực hiện sau mỗi 1 phút, thông qua việc thực thi tập lệnh đó trên crontab của tôi.

Kết quả? Hiệu suất của Safari bây giờ là tốt hơn! :) Tôi không cần phải đặt lại Safari theo cách thủ công một lần một giờ rưỡi và điều đó làm tôi rất hạnh phúc :) (mặc dù, gần như giống nhau xảy ra trên nền)

Tác dụng phụ? Weeell. Làm mới các tab của bạn không phải lúc nào cũng muốn. Có một tác dụng phụ rõ ràng mà tôi có thể nghĩ đến. Nếu quá trình "Nội dung web Safari" của bạn bị đóng trong khi bạn đang ở giữa một số hoạt động quan trọng, bạn sẽ mất mọi thứ. Ví dụ, nếu mức tiêu thụ bộ nhớ của tôi quá cao trong khi tôi đang nghiêng về điều này, và kịch bản đã giết chết quá trình nội dung của tôi, tôi sẽ mất mọi thứ.

Rất vui, tôi đã sử dụng tập lệnh trong một vài ngày và vẫn không mất bất kỳ thứ gì.

Mặc dù giải pháp này đã mang đến cho tôi trải nghiệm tốt hơn khi duyệt đến thời điểm này và tôi vẫn không cảm thấy khó chịu khi có một số văn bản bị mất, tôi biết điều đó là có thể. Vì vậy, tôi muốn biết các bạn có biết cách giải phóng một khu vực cụ thể của bộ nhớ của một quá trình hay không.

Tôi hỏi điều này vì khi tôi chạy vmmap trên pid của "Safari Web Content", tôi nhận thấy rằng phần lớn bộ nhớ được sử dụng được cấp phát trong Vùng Malloc "JavaScriptCore FastMalloc_0xaca89d40". Bằng cách đó, tôi nghĩ rằng nếu tôi có thể nhận được bộ nhớ đó, tôi có thể có trải nghiệm tốt hơn trên Safari, mà không có nguy cơ mất quá nhiều (tất nhiên, điều đó sẽ phụ thuộc vào cách Safari xử lý việc giải phóng bộ nhớ không mong muốn tinh tế đó, nhưng Tôi có đức tin).

Hãy đến cuối. Bạn có nghĩ rằng cách tiếp cận của tôi là tốt hay bạn có thể nghĩ ra bất kỳ tác dụng phụ nào khác của việc làm những gì tôi làm không? Hơn nữa, bạn có biết tôi có thể xóa bộ nhớ của khu vực cụ thể đó không? Tôi không quan tâm nếu tôi sẽ cần phải có quyền truy cập root (ít nhất là cho mục đích thử nghiệm). Và cuối cùng, bạn cũng đã phát triển một cách riêng để thúc đẩy trải nghiệm duyệt web của mình, khi sử dụng Safari chưa? Nếu có, hãy chia sẻ! :)

Fernando.

Trả lời

0

Không, bạn không thể bắt buộc một quy trình khác để giải quyết bộ nhớ. Điều đó gần như chắc chắn sẽ sụp đổ nó (đó là hiệu quả những gì bạn đang làm bằng cách giết chết quá trình Safari Web Content).

+0

Yeap, đó là phỏng đoán đầu tiên của tôi .. Nhưng tôi nghĩ phải có cách để bắt buộc, ít nhất quá trình này thuộc về người dùng của tôi hahaha Tất nhiên, điều đó sẽ vi phạm nhiều nguyên tắc lập trình tốt . Tôi đã ngạc nhiên bởi thực tế là Safari.app không thực sự sụp đổ khi tôi bỏ qua quy trình Nội dung của nó (trong thực tế đã giải quyết mọi thứ cần thiết cho Safari, buộc nó phải làm mới các tab). Do đó, bằng cách deallocating chỉ là khu vực của bộ nhớ, tôi có niềm tin rằng Safari sẽ xử lý chính nó mà không mất những thứ quan trọng khác. Tôi không chắc chắn nếu quá trình WebProcess sẽ xử lý nó, mặc dù .. – FernandoH

0

tôi đã làm một cái gì đó tương tự, chỉ với AppleScript:

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 

Sau đó, tôi thiết lập một công việc định kỳ để chạy mỗi buổi sáng lúc 03:00. Tôi dường như không bị quá nhiều sưng lên suốt cả ngày. Chỉ sau một vài ngày chạy, quy trình "Nội dung web Safari" của tôi bắt đầu ăn hơn 2 bộ nhớ của bộ nhớ.

1 3 * * * /usr/bin/osascript /path/to/restart-safari.scpt 
Các vấn đề liên quan