2017-11-20 9 views
11

React Nativeでwebsocket blobの実装を使用しているときにメモリリークが発生しており、問題を見つけることができません。我々は問題が最も可能性の高いフレームワークを見ることができますオブジェクト-Cのスキルを持つRCTWebSocketModule.mReact NativeのiOS WebSocketメモリの問題

誰でもで後でコールツリーで、おそらくRCTSRWebSocket.mでバイナリメッセージを処理するかのように起こっていることがわかりますXcodeの楽器を使用して

なぜ受信されたメッセージに割り当てられたメモリの一部が適切に解放されていないのですか?

Link to Github issue

Memory usage

Debug Info

Call tree

+0

割り当てが起こる場所スクリーンショットを示し、そのその後のデータに何が起こるかクリアしていません..あなたはそれをどこかに保存していますか?編集:気にしない気持ちは分かりません。 – Aris

答えて

0

最後に問題を解決できます。 WebSocket、特にBLOBの実装を掘り下げた後、私はすべてのBLOBが直接クローズされていない限りメモリ内に留まることを発見しました。

これは、受信したデータに終わった後、あなたがこのようにブロブを閉じる必要があることを意味します

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

多分それは私ですが、frameDataがコピーされているようですか?それはNSDataなので、参照型で、コピーが必要な理由はわかりません。それは後で変更され、元のままにしたいので必要です。さもなければコピーは完全に不要で、おそらくこれは少し役立ちますか? 読み取り中のすべてのデータがコピーされ、おそらく '_handleMessage'関数に何らかの形で保持されていると、大きなメモリ割り当てにつながる可能性があります。

だから私の最初の試みは、次のようになります。

  1. だけにframeDataを送信し、それをコピーしないでください:

[self _handleMessage:frameData];

  • チェックした場合、
      おそらく_handleMessage関数でそれを終えると、frameDataを強制的にnilに設定することができます。
  • +0

    1:メモリ使用量を大幅に減らす一方、 "リークパターン"はまだ存在します。さらに重要なことに、残念なことに機能が損なわれます。 2:frameDataをNULLまたはnilに設定しても、何も変更されていないようです。 –

    +0

    @SteffenChristensen hm strange。 handleMessage関数のコードを投稿することは可能ですか? –

    +0

    @BobdeGraafここに行く:https://github.com/facebook/react-native/blob/1e8f3b11027fe0a7514b4fc97d0798d3c64bc895/Libraries/WebSocket/RCTSRWebSocket.m#L697 – Lasse

    関連する問題