コンポーネントが取り外されたときにReactコンポーネントの状態がガベージコレクションされず、メモリリークが発生します。 macOS SierraでChrome 10.12.5でreact @ 15.5.4を使用しています。コンポーネントの状態のメモリリークが発生しました
のように状態をcomponentDidMount
に設定しています。メモリリークを確認するために
、私は私のcomponentDidMount
に以下を追加しました:
let arr = new Uint8Array(1024 * 1024 * 30);
this.setState({
test: arr
});
をし、ヒープに割り当てUint8Arrayの30メガバイトを確認するために、ヒープのスナップショットを取りました。
次に、コンポーネントがconsole.log
でマウント解除されることを確認しました。componentWillUnmount
です。
後でヒープスナップショットをとると、ガベージコレクションのための十分な時間が経過しても、Uint8Arrayがヒープに残ります。
この問題のデバッグを開始する場所についてのご意見はありますか?またはソースコードからの任意の観測?
コンポーネントがDOMから削除されても、コンポーネントおよびその状態を表す実際のJSオブジェクトが削除されない場合があります。おそらくリアクションはそれを後で再利用するためにキャッシュしますか? Reactでバグを起こすことは価値があるかもしれません。 –
私はあなたが 'windowを呼んでいることをあなたが投稿したgithub link(https://github.com/dgraph-io/dgraph/blob/master/dashboard/src/containers/GraphContainer.js#L61)に見ました。 addEventListener 'を呼び出す。そのイベントリスナーも削除していますか? [それはメモリリークを引き起こす可能性があります。](https://developer.mozilla.org/en-US/docs/Extensions/Common_causes_of_memory_leaks_in_extensions#Failing_to_clean_up_event_listeners)私はちょうどあなたの問題を見ていましたので、私は完全にオフになっている場合、私は謝罪します。 –
@RicoKhler私は[そのリスナーを削除する](https://github.com/dgraph-io/dgraph/blob/master/dashboard/src/containers/GraphContainer.js#L73)です。私は別の問題だと思っています。手元にある問題は、状態オブジェクトがガベージコレクションされていないからです。 –