Finalizer-Statistiken

9

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.)

    
Florian Weimer 03.12.2017, 14:07
quelle

2 Antworten

4

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%

Ссылка

    
Tim Cooper 03.12.2017 17:53
quelle
0

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.

Ссылка

%Vor%     
John Doe 24.02.2018 09:34
quelle

Tags und Links