2017-11-20 139 views
11

Występuje przeciek pamięci, gdy używamy implementacji blob websocket w React Native i nie jesteśmy w stanie zlokalizować problemu.Problem z pamięcią sieciową iOS w React Native

Korzystanie Xcode Instruments widzimy, że problem najprawdopodobniej dzieje się w sposób ramy obsługuje wiadomości binarnych w RCTSRWebSocket.m czy może później w drzewie połączeń w RCTWebSocketModule.m

Każdy z Object-C umiejętności, które są w stanie zobaczyć dlaczego niektóre wspomnienia (przypuszczalnie alokowane do otrzymanych wiadomości) nie są poprawnie wydawane?

Link to Github issue

Memory usage

Debug Info

Call tree

+0

zrzut ekranu pokazuje, gdzie podział się dzieje, to nie wiadomo, co się dzieje z danymi potem .. gdzieś go gdzieś przechowujesz? Edit: nevermind Nie zauważyłem linku github – Aris

Odpowiedz

0

Problem można ostatecznie rozwiązać. Po kopaniu wokół implementacji WebSockets, a zwłaszcza obiektów typu blob, odkryłem, że wszystkie obiekty typu blob pozostaną w pamięci, o ile nie są bezpośrednio zamknięte.

Oznacza to, że po skończysz z otrzymanych danych, należy zamknąć Blob tak:

ws.onmessage = function (e) { 
    // Do whatever with the data through e.data. 
    const data = e.data; 
    // When you are done with the received data, you must close the Blob: 
    e.data.close(); 
}; 
1

Może to mnie, ale wydaje się, że frameData jest kopiowany? To NSData jest typem referencyjnym i nie jest dla mnie jasne, dlaczego kopia jest potrzebna? Jest to konieczne, ponieważ zmieniło się później i chcesz, aby oryginał pozostał taki sam? W przeciwnym razie kopiowanie jest zupełnie niepotrzebne i może to trochę pomaga? Jeśli wszystkie dane, które odczytuje, są kopiowane i prawdopodobnie zachowane w funkcji "_handleMessage", może to prowadzić do dużych przydziałów pamięci.

więc moje pierwsze próby byłoby:

  1. Wystarczy wysłać frameData się i nie kopiuj go:

[self _handleMessage:frameData];

    Sprawdź, czy
  1. możesz prawdopodobnie ustawiać frameData na zero, gdy skończysz pracę w funkcji _handleMessage.
+0

1: Podczas gdy znacznie zmniejsza to zużycie pamięci, nadal występuje "wzorzec wycieku". Co ważniejsze, niestety łamie to funkcjonalność. 2: Ustawienie frameData na NULL lub zero nie wydaje się nic zmieniać. –

+0

@SteffenChristensen hm dziwne. Czy możliwe jest opublikowanie kodu funkcji handleMessage? –

+0

@BobdeGraaf Tutaj możesz przejść: https://github.com/facebook/react-native/blob/1e8f3b11027fe0a7514b4fc97d0798d3c64bc895/Libraries/WebSocket/RCTSRWebSocket.m#L697 – Lasse