Es gibt zwei Ansätze, um die Speichernutzung einzuschränken: Ex post facto und präventiv. Das heißt, Sie können versuchen, Ihr Programm zu beenden, nachdem es zu groß geworden ist, oder Sie können es so programmieren, dass es überhaupt nicht zu groß wird.
Wenn Sie auf dem Ex-post-Facto-Ansatz bestehen, können Sie das folgende Bash-Skript verwenden. Dieses Skript ermittelt zuerst die Speichermenge (wie durch "resident set size" definiert), die der Prozess mit processid pid verwendet, filtert alle nicht numerischen Daten mit grep heraus und speichert die Menge als Variable n. Das Skript prüft dann, ob n größer als das angegebene x ist. Wenn dies der Fall ist, wird der Prozess mit processid pid abgebrochen.
Bitte beachten Sie:
- Sie müssen durch
<pid>
die Prozess-ID Ihres Programms ersetzen .
- Sie müssen durch
<x>
rss = "resident set size" (dh die tatsächliche Speichergröße) ersetzen, die das Programm nicht überschreiten soll.
n=$(ps -<pid> -o rss | grep '[0-9]')
if [ $n -gt <x> ]; then kill -9 <pid>; fi
Wenn Sie möchten, dass dies alle y Sekunden ausgeführt wird, schließen Sie es einfach in eine Schleife ein und weisen Sie es an, nach jeder Iteration y Sekunden zu warten. Sie können auch einen ähnlichen Befehl mit schreiben top
. Ihr Ausgangspunkt wäre top -l 1|grep "<pid>"|awk '{print $10}'
.
Die Antwort von @ kenorb hat mir bei meinem Skript geholfen
Während ich glaube, dass dies die Frage beantwortet, glaube ich, dass es auf lange Sicht besser ist, einen präventiven Ansatz mit manueller Speicherzuweisung zu wählen.
Sind Sie sicher, dass die Speichernutzung wirklich ein Problem ist? In der Go- Dokumentation heißt es:
Der Go-Speicherzuweiser reserviert einen großen Bereich des virtuellen Speichers als Arena für Zuweisungen. Dieser virtuelle Speicher ist lokal für den jeweiligen Go-Prozess. Die Reservierung beraubt andere Speicherprozesse nicht.
Wenn Sie immer noch glauben, dass Sie ein Problem haben, empfehle ich Ihnen, Ihren Speicher manuell zu verwalten, wie dies in der Programmiersprache C erfolgt. Da go in C geschrieben ist, habe ich vermutet, dass es Möglichkeiten gibt, in die C-Speicherverwaltung / -zuordnungen zu gelangen, und tatsächlich gibt es diese. Sehen Sie sich dieses Github- Repository an, das
Ermöglicht die manuelle Speicherverwaltung über den Standard-C-Allokator für Ihr System. Es ist eine dünne Hülle auf Malloc, Calloc und frei von. Weitere Informationen zu diesen Funktionen für Ihr System finden Sie unter man malloc. Diese Bibliothek verwendet cgo.
Der Anwendungsfall lautet wie folgt:
Warum willst du das?
Wenn ein Programm Speicherdruck verursacht oder dem System der Speicher ausgeht, kann es hilfreich sein, die Speicherzuweisungen und Freigaben manuell zu steuern. Go kann Ihnen bei der Steuerung von Zuordnungen helfen, es ist jedoch nicht möglich, nicht benötigte Daten explizit freizugeben.
Dies scheint eine bessere langfristige Lösung zu sein.
Wenn Sie mehr über C erfahren möchten (einschließlich Speicherverwaltung), ist
die Programmiersprache C die Standardreferenz.