Mir wurde zuvor gesagt, dass ein Zeichen dafür, dass eine Anwendung einen Speicherverlust aufweist, kernel_task
ein großer Speicherbedarf ist, der üblicherweise in der Größenordnung von Gigabyte liegt. Wenn ein Fehler kext
diese Speichernutzung verursacht, würden wir eine Diskrepanz zwischen dem zugewiesenen Speicher und den erwarteten zugewiesenen Speichern erwarten, d. H.
diff <(kextstat|tr -s ' ' | cut -d ' ' -f 5) <(kextstat| tr -s ' ' | cut -d ' ' -f 6)
würde etwas anderes als die Wörter "Wired" und "Name" zurückgeben.
Während ich meine Diplomarbeit schrieb, habe ich festgestellt, dass das Ändern eines PDFs, während es in der Vorschau geöffnet ist, häufig zu schlechten Ereignissen führt: Gelegentlich kann die Speichernutzung von kernel_task
auf etwa acht Gigabyte oder mehr ansteigen. Wenn ich die Vorschau beende, kehrt sie sofort zum Normalzustand zurück . Offensichtlich stimmt etwas nicht - und Preview verliert unter diesen Bedingungen Speicher.
Meine Frage lautet also: Wenn ich weiß, dass ein Prozess durch eine plötzliche und unerwartete Vergrößerung des Footprints von RAM ausgelaufen ist kernel_task
, warum kann OS X dann nicht wissen, dass etwas schief gelaufen ist? Wenn das Beenden von Preview mein fehlendes malloc()
Gedächtnis wiederherstellt , warum führt Darwin die Speicherbereinigung nicht automatisch für mich durch?
Habe ich ein grundlegendes Missverständnis darüber, wie Speicherverwaltung funktioniert?
EDIT: (15.9.15)
Hier ist eine Demonstration dessen, wovon ich spreche. Zuallererst bemerke ich eine hohe Speichernutzung durch kernel_task
(Hinweis: Die Vorschau ist geöffnet und wird mit 333 MiB RAM am unteren Rand des Aktivitätsmonitors angezeigt):
Befolgen Sie die hilfreichen Bemerkungen von Ashley unten, um herauszufinden, wie viel jeder Text verwendet:
$ 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
$
Also keine große Menge. Mein Computer verfügt sowohl über diskrete als auch über integrierte GPUs. Ihre Treiber verwenden nur wenige MiB Kabel-RAM. Lassen Sie uns in meiner Vermutung die Vorschau beenden und untersuchen, was mit dem Speicherbedarf von kernel_task
:
Die Vorschau ist weg und der Speicherbedarf des Kernels ist dramatisch gesunken. Es gibt immer noch keine Hinweise auf eine Änderung der Kext-Verwendung: Die Ausgabe des obigen Befehls bleibt unverändert.
Bearbeiten : Fehler als Nr. 22701036 gemeldet. Ich warte immer noch auf eine Antwort von Apple. Es gibt nichts besonders Interessantes, wenn Sie den Prozess in ActivityMonitor überprüfen, aber vielleicht fehlt mir etwas.
kextstat
. Mein Verständnis ist , dass , wenn ein kext undicht ist , dann die zugeteilten Bytes und jene , dass der Kernel weiß , sind zugewiesen wird anders sein. In diesem Fall habe ich das dort abgelegt, um zu zeigen, dass ich keinen undichten Text habe - also 2) tritt dies nicht auf, wenn die Vorschau RAM isst. Stattdessen kernel_task
wächst viel. Ich werde versuchen, dieses Problem neu zu erstellen und ein Foto zu machen :-).
diff
Befehl vergleicht die SpaltenSize
undWired
aus derkextstat
Ausgabe. Ich bin damit einverstanden, dassSize
"zugeordneter Speicher" ist, aber ich glaube nicht, dassWired
"erwartet wird, zugewiesen zu werden" (man kextstat
beschreibt es als "die Anzahl der verkabelten Bytes des Kernel-Speichers, die der Text belegt"). 2) Sehen Sie die Diskrepanz zwischenSize
undWired
wann Sie das Problem mit der Vorschau haben?