2016-06-06 11 views
1

Ich verwende Websockets, um Protcol-Puffer zu empfangen und einen Speicherverlust zu erfahren. Dieses Leck tritt unabhängig von der Größe und Häufigkeit des eingehenden Puffers auf.Dart Websocket Speicherleck

Die Protobufs werden als Blobs empfangen, aber beim Empfangen als arrayBuffer war das gleiche Leck vorhanden. Momentan habe ich nur einen Paket-Handler implementiert, der den Blob auf null setzt, um zu versuchen, die Garbage Collection aufzurufen.

Mein hören nennen: ws.onMessage.listen(handlePacket);

Meine Event-Handler: void handlePacket(message) { message = null; }

Ich verstehe nicht ganz, wenn der Strom von messageEvents in der websocket eine Warteschlange, die nicht verarbeitet Ereignisse Ausreihen, aber es scheint, dass der gesamte für die eingehenden Ereignisse reservierte Speicher nicht als Garbage Collection erfasst wird. Alle Hilfe wird geschätzt.

EDIT Client-Seite Code:

void _openSocket() { 
    if (ws == null) { 
     ws = new WebSocket('ws://localhost:8080/api/ws/open'); 
     // ws.binaryType = "arraybuffer"; 
    } 
    } 

    void _closeSocket() { 
    if (ws != null) { 
     ws.close(); 
     print("socket closed"); 
     ws = null; 
    } 
    } 

void _openStream (String fieldName, [_]) { 
    //Check if we need to open the socket 
    _openSocket(); 
    //Request the proper data 
    Map ask = {"Request": "Stream", "Field": fieldName}; 
    if (ws.readyState == 0){ 
    ws.onOpen.listen((_) { 
     ws.send(JSON.encode(ask)); 
    }); 
    } else { 
    ws.send(JSON.encode(ask)); 
    } 

    activeQuantities++; 
    if (activeQuantities == 1) { 
    _listen(); 
    } 
} 

// Receive data from the socket 
_listen() { 
    ws.onError.listen((_){ 
    print("Error"); 
    }); 
    ws.onClose.listen((_){ 
    print("Close"); 
    }); 
    ws.onMessage.listen(handlePacket);  
} 

void handlePacket(message) { 
    message = null; 
} 
+0

Wo ist der Rest des Codes? Sie sollten alles einschließen, was notwendig ist, um das Problem zu replizieren. – Laurel

+0

Weitergeleiteter Code, wenn auf eine Schaltfläche geklickt wird _openStream heißt, die Socket-Verbindung zu initiieren und/oder den angeforderten Daten ein weiteres Feld hinzuzufügen. – jkramber

Antwort