Gibt es eine Möglichkeit, die Gesamtzahl der Finalisten zu erhalten, die mit runtime.SetFinalizer
registriert wurden und die noch nicht ausgeführt wurden ?
Wir überlegen uns, einigen unserer Produkte einen struct
mit einem registrierten Finalizer hinzuzufügen, um Speicher freizugeben, der mit malloc
zugewiesen wurde, und das Objekt könnte möglicherweise eine relativ hohe Zuteilungsrate haben. Es wäre schön, wenn wir die Anzahl der Finalizer überwachen könnten, um sicherzustellen, dass sie sich nicht häufen und Speicherfehler verursachen (wie sie es bei anderen Garbage Collectors tun).
(Ich bin mir bewusst, dass eine explizite Freigabe dieses Problem vermeiden würde, aber wir können den vorhandenen Code nicht ändern, der keine Close
-Funktion oder etwas ähnliches aufruft.)
Sie können die Anzahl dieser Objekte beibehalten, indem Sie eine nicht portierte Paketvariable inkrementieren und dekrementieren, wenn ein neues Objekt erstellt bzw. abgeschlossen wird.
Zum Beispiel:
%Vor% Es ist möglich, einen Wrapper für runtime.SetFinalizer
zu erstellen, der die Zählung für Sie übernimmt. Natürlich ist es eine Frage der Verwendung überall dort, wo Sie SetFinalizer
verwenden.
Falls dies problematisch ist, können Sie auch SetFinalizer
Quellcode direkt ändern, aber das erfordert einen modifizierten Go Compiler .
Es werden atomare ganze Zahlen verwendet, da SetFinalizer
auf verschiedenen Threads aufgerufen werden kann, und ansonsten ist ein Zähler möglicherweise nicht genau, da ohne diese möglicherweise eine Race-Bedingung auftreten könnte. Golang garantiert, dass die Finalizer von einer einzigen Goroutine aufgerufen werden, so dass sie nicht für die innere Funktion benötigt werden.
Tags und Links go finalization