Trước đây tôi đã được thông báo rằng một dấu hiệu cho thấy một số ứng dụng bị rò rỉ bộ nhớ là kernel_task
có dung lượng bộ nhớ lớn, thường là theo thứ tự gigabyte. Nếu một sự cố kext
xảy ra gây ra việc sử dụng bộ nhớ này, chúng ta sẽ thấy sự khác biệt giữa bộ nhớ được phân bổ và những người dự kiến sẽ được phân bổ, tức là
diff <(kextstat|tr -s ' ' | cut -d ' ' -f 5) <(kextstat| tr -s ' ' | cut -d ' ' -f 6)
sẽ trả lại một cái gì đó ngoài các từ 'Có dây' và 'Tên'.
Trong khi viết luận án của mình, tôi đã nhận thấy rằng việc thay đổi pdf trong khi nó được mở trong Bản xem trước thường gây ra những điều tồi tệ xảy ra: đôi khi, việc sử dụng bộ nhớ kernel_task
có thể tăng lên khoảng tám gigabyte hoặc hơn. Nếu tôi giết bản xem trước, nó sẽ trở lại bình thường ngay lập tức . Vì vậy, rõ ràng có điều gì đó không ổn - và Preview đang rò rỉ bộ nhớ trong những điều kiện này.
Vì vậy, câu hỏi của tôi là: nếu tôi biết rằng một quy trình đã bị rò rỉ ram thông qua sự gia tăng đột ngột và bất ngờ về dấu chân kernel_task
, tại sao OS X không thể biết rằng đã xảy ra sự cố. Nếu giết Preview phục hồi của tôi mất tích malloc()
'd bộ nhớ, tại sao không Darwin làm thu gom rác thải automagically cho tôi?
Tôi có hiểu lầm cơ bản về cách quản lý bộ nhớ hoạt động không?
EDIT: (15/9/15)
Đây là một minh chứng về những gì tôi đang nói về. Trước hết, tôi nhận thấy việc sử dụng bộ nhớ cao bằng cách kernel_task
(lưu ý Xem trước đang mở, chỉ hiển thị ở dưới cùng của Trình giám sát hoạt động, sử dụng 333 MiB của ram):
Theo các nhận xét hữu ích của Ashley bên dưới, hãy tìm hiểu xem mỗi kext đang sử dụng bao nhiêu:
$ kextstat | awk 'NR==1{ printf "%10s %s\n", $5, $6; } NR!=1{ printf "%10d %s\n", $5, $6; }' | sort -n
...
...
...
1249280 com.apple.driver.DspFuncLib
1769472 com.apple.nvidia.driver.NVDAGK100Hal
2629632 com.apple.nvidia.driver.NVDAResman
6184960 com.apple.driver.AirPort.Brcm4360
$
Vì vậy, không phải là một số tiền lớn. Máy của tôi có cả GPU rời và tích hợp; trình điều khiển của họ chỉ sử dụng một vài MiB ram có dây. Theo linh cảm của tôi, chúng ta hãy giết Preview và xem điều gì xảy ra với dấu chân bộ nhớ của kernel_task
:
Xem trước đã biến mất, và dấu chân bộ nhớ của kernel đã giảm đáng kể. Vẫn không có bằng chứng về sự thay đổi trong cách sử dụng kext: đầu ra của lệnh trên không thay đổi.
Chỉnh sửa : Bug báo cáo là số 22701036. Tôi vẫn đang chờ phản hồi từ apple. Không có gì đặc biệt thú vị nếu bạn kiểm tra quy trình trong ActivityMonitor, nhưng có lẽ tôi đang thiếu thứ gì đó.
kextstat
. Hiểu biết của tôi là nếu một kext bị rò rỉ, thì các byte được phân bổ và các byte mà kernel biết được phân bổ sẽ khác nhau. Trong trường hợp này, tôi đã đặt nó ở đó để cho thấy rằng tôi không có một kext bị rò rỉ - vì vậy, 2) điều này không xảy ra khi Preview ăn ram. Thay vào đó, kernel_task
phát triển rất nhiều. Tôi sẽ thử và tạo lại vấn đề này và chụp ảnh :-).
diff
lệnh của bạn đang so sánh các cộtSize
vàWired
cột từkextstat
đầu ra. Tôi đồng ý rằng đóSize
là "bộ nhớ được phân bổ", nhưng tôi không nghĩWired
là "dự kiến sẽ được phân bổ" (man kextstat
mô tả nó là "Số byte bộ nhớ có dây của bộ nhớ kernel mà kext chiếm"). 2) Bạn có thấy sự khác biệt giữaSize
vàWired
khi bạn gặp sự cố với Xem trước không?