Ich habe versucht, einen HTTP-Client zu schreiben, um mehrere Feeds gleichzeitig abzurufen (bis zu 1k), auch als Übung, um Netty 4 zu lernen.
Meine Frage ist, ob es irgendwo eine gute Erklärung dafür gibt, wie die neue ByteBuf-Infrastruktur funktioniert. Wer "besitzt" sie, wie werden sie geteilt (sind sie?)? Hat jeder ChannelHandler in einer ChannelPipeline einen eigenen ByteBuf?
Hier ist ein Beispiel, das mich verwirrt hat:
Ich habe einer HTTP-Client-Pipeline eine Instanz der folgenden Klasse hinzugefügt:
%Vor%Wenn ich BufUtil.retain nicht bei msg anrufe, scheint GCd zu kommen und ich bekomme alle möglichen falschen Fehler.
HttpContent
erweitert ReferenceCounted
, um den Lebenszyklus des enthaltenen Puffers zu verfolgen. Wenn ein ReferenceCounted
instanziiert wird, startet es seine Lebensdauer mit refCnt
von 1
. Wenn Sie retain()
aufrufen, wird refCnt
erhöht. refCnt
wird auf release()
verringert und die zugrunde liegende Ressource (in diesem Fall ByteBuf
) wird zerstört, sobald refCnt
0
wird.
Normalerweise muss ein Handler keinen Verweis auf die Nachricht behalten, die er bearbeitet hat, weil die Nachricht normalerweise weggeworfen oder in etwas anderes umgewandelt wird, wenn sie einmal bearbeitet wurde. Daher muss release()
method für die Nachricht aufgerufen werden, sobald Ihr Handler damit fertig ist. Dies ist oft fehleranfällig und führt sehr schnell zu einem Ressourcenleck.
Um das Leck zu vermeiden, das sehr schwer aufzuspüren ist, erweitern Sie SimpleChannelInboundHandler
, das release()
aufruft, automatisch auf die Nachrichten, sobald sie bearbeitet werden.
Weitere Informationen zur Referenzzählung in Netty finden Sie in der Wiki-Seite . Außerdem erhalten Sie detaillierte Informationen zur Fehlerbehebung von Pufferlecks, indem Sie den Pufferleck-Erkennungsmechanismus von Netty verwenden.
Tags und Links netty